{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/tomasonjo/blogs/blob/master/pyg2neo/Movie_recommendations.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "* Updated to GDS 2.0 version\n",
        "* Link to original blog post: https://towardsdatascience.com/integrate-neo4j-with-pytorch-geometric-to-create-recommendations-21b0b7bc9aa"
      ],
      "metadata": {
        "id": "Vfnh4de0ZSej"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "v_F-Vr4Yz2A9",
        "outputId": "01636e0f-6f38-43f8-d08b-251522b993a3"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: sentence_transformers in /usr/local/lib/python3.7/dist-packages (2.1.0)\n",
            "Requirement already satisfied: neo4j in /usr/local/lib/python3.7/dist-packages (4.4.1)\n",
            "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (1.19.5)\n",
            "Requirement already satisfied: transformers<5.0.0,>=4.6.0 in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (4.15.0)\n",
            "Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (1.4.1)\n",
            "Requirement already satisfied: nltk in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (3.2.5)\n",
            "Requirement already satisfied: tokenizers>=0.10.3 in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (0.10.3)\n",
            "Requirement already satisfied: huggingface-hub in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (0.4.0)\n",
            "Requirement already satisfied: tqdm in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (4.62.3)\n",
            "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (1.0.2)\n",
            "Requirement already satisfied: torch>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (1.10.0+cu111)\n",
            "Requirement already satisfied: sentencepiece in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (0.1.96)\n",
            "Requirement already satisfied: torchvision in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (0.11.1+cu111)\n",
            "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch>=1.6.0->sentence_transformers) (3.10.0.2)\n",
            "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (21.3)\n",
            "Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (2.23.0)\n",
            "Requirement already satisfied: filelock in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (3.4.2)\n",
            "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (2019.12.20)\n",
            "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (6.0)\n",
            "Requirement already satisfied: sacremoses in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (0.0.47)\n",
            "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (4.10.0)\n",
            "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging>=20.0->transformers<5.0.0,>=4.6.0->sentence_transformers) (3.0.6)\n",
            "Requirement already satisfied: pytz in /usr/local/lib/python3.7/dist-packages (from neo4j) (2018.9)\n",
            "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->transformers<5.0.0,>=4.6.0->sentence_transformers) (3.7.0)\n",
            "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from nltk->sentence_transformers) (1.15.0)\n",
            "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->transformers<5.0.0,>=4.6.0->sentence_transformers) (1.24.3)\n",
            "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->transformers<5.0.0,>=4.6.0->sentence_transformers) (3.0.4)\n",
            "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->transformers<5.0.0,>=4.6.0->sentence_transformers) (2.10)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->transformers<5.0.0,>=4.6.0->sentence_transformers) (2021.10.8)\n",
            "Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from sacremoses->transformers<5.0.0,>=4.6.0->sentence_transformers) (7.1.2)\n",
            "Requirement already satisfied: joblib in /usr/local/lib/python3.7/dist-packages (from sacremoses->transformers<5.0.0,>=4.6.0->sentence_transformers) (1.1.0)\n",
            "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->sentence_transformers) (3.0.0)\n",
            "Requirement already satisfied: pillow!=8.3.0,>=5.3.0 in /usr/local/lib/python3.7/dist-packages (from torchvision->sentence_transformers) (7.1.2)\n",
            "Looking in links: https://data.pyg.org/whl/torch-1.10.0+cpu.html\n",
            "Requirement already satisfied: torch-scatter in /usr/local/lib/python3.7/dist-packages (2.0.9)\n",
            "Requirement already satisfied: torch-sparse in /usr/local/lib/python3.7/dist-packages (0.6.12)\n",
            "Requirement already satisfied: torch-cluster in /usr/local/lib/python3.7/dist-packages (1.5.9)\n",
            "Requirement already satisfied: torch-geometric in /usr/local/lib/python3.7/dist-packages (2.0.3)\n",
            "Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages (from torch-sparse) (1.4.1)\n",
            "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (1.19.5)\n",
            "Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (2.23.0)\n",
            "Requirement already satisfied: tqdm in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (4.62.3)\n",
            "Requirement already satisfied: PyYAML in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (6.0)\n",
            "Requirement already satisfied: jinja2 in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (2.11.3)\n",
            "Requirement already satisfied: pyparsing in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (3.0.6)\n",
            "Requirement already satisfied: networkx in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (2.6.3)\n",
            "Requirement already satisfied: googledrivedownloader in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (0.4)\n",
            "Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (1.1.5)\n",
            "Requirement already satisfied: yacs in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (0.1.8)\n",
            "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (1.0.2)\n",
            "Requirement already satisfied: rdflib in /usr/local/lib/python3.7/dist-packages (from torch-geometric) (6.1.1)\n",
            "Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from jinja2->torch-geometric) (2.0.1)\n",
            "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas->torch-geometric) (2018.9)\n",
            "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas->torch-geometric) (2.8.2)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas->torch-geometric) (1.15.0)\n",
            "Requirement already satisfied: isodate in /usr/local/lib/python3.7/dist-packages (from rdflib->torch-geometric) (0.6.1)\n",
            "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from rdflib->torch-geometric) (4.10.0)\n",
            "Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from rdflib->torch-geometric) (57.4.0)\n",
            "Requirement already satisfied: typing-extensions>=3.6.4 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->rdflib->torch-geometric) (3.10.0.2)\n",
            "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->rdflib->torch-geometric) (3.7.0)\n",
            "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->torch-geometric) (2.10)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->torch-geometric) (2021.10.8)\n",
            "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->torch-geometric) (1.24.3)\n",
            "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->torch-geometric) (3.0.4)\n",
            "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->torch-geometric) (1.1.0)\n",
            "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->torch-geometric) (3.0.0)\n"
          ]
        }
      ],
      "source": [
        "!pip install sentence_transformers neo4j\n",
        "!pip install torch-scatter torch-sparse torch-cluster torch-geometric -f https://data.pyg.org/whl/torch-1.10.0+cpu.html"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "RlHc8p58z6b1",
        "outputId": "e792652a-af60-4c21-e004-f747a6dc1f44",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "cuda\n"
          ]
        }
      ],
      "source": [
        "import torch\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "from torch.nn import Linear\n",
        "import torch.nn.functional as F\n",
        "from sentence_transformers import SentenceTransformer\n",
        "\n",
        "import torch_geometric.transforms as T\n",
        "from torch_geometric.nn import SAGEConv, to_hetero\n",
        "\n",
        "from torch_geometric.data import HeteroData\n",
        "from torch_geometric.transforms import ToUndirected, RandomLinkSplit\n",
        "\n",
        "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
        "print(device)"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Integrate Neo4j with PyTorch Geometric to create recommendations\n",
        "## Leverage the power of PyTorch Geometric to develop and train custom Graph Neural Networks for your application\n",
        "I have wanted to write about the PyTorch Geometric (pyG) ever since I saw they announced their collaboration with Stanford University on their workshop. The PyTorch Geometric (pyG) is a library built upon PyTorch to help you easily write and train custom Graph Neural Networks for your applications. In this blog post, I will present how you can fetch data from Neo4j to create movie recommendations in PyTorch Geometric.\n",
        "The graph we will be working with is the MovieLens dataset, which is handily available as a Neo4j Sandbox project. Not knowing before, there is an example in pyG that also uses the MovieLens dataset for a link prediction task. The links between users and movies have a rating score. We can then use the graph neural network model to predict which unseen movies a user is likely to rate high and then use that information to recommend them.\n",
        "The main goal of this post is to show you how to convert a Neo4j graph into a heterogeneous pyG graph. As a side goal, we will also prepare some of the node features in Neo4j using the Graph Data Science library and export them to pyG.\n",
        "## Agenda\n",
        "* Develop movie embeddings to capture movie similarity based on the actors and directors\n",
        "* Export Neo4j Graph and construct a heterogeneous pyG graph\n",
        "* Train the GNN model in pyG\n",
        "* Create predictions and optionally store them back to Neo4j\n",
        "\n",
        "As always, I have prepared a Google Colab notebook if you want to follow along with the examples in this post.\n",
        "## Develop movie embeddings to capture movie similarity based on the actors and directors\n",
        "First, you need to create and open the [Recommendations project in Neo4j Sandbox](https://sandbox.neo4j.com/?usecase=recommendations) that has the MovieLens dataset already populated. Next, you need to define the Neo4j connection in the notebook."
      ],
      "metadata": {
        "id": "WgdcrPZgf84C"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "4ZKcA2wW5K_J"
      },
      "outputs": [],
      "source": [
        "from neo4j import GraphDatabase\n",
        "\n",
        "url= 'bolt://3.86.43.255:7687'\n",
        "user = 'neo4j'\n",
        "password = 'company-science-journals'\n",
        "\n",
        "driver = GraphDatabase.driver(url, auth=(user, password))\n",
        "\n",
        "def fetch_data(query, params={}):\n",
        "  with driver.session() as session:\n",
        "    result = session.run(query, params)\n",
        "    return pd.DataFrame([r.values() for r in result], columns=result.keys())\n"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "The link prediction example in pyG uses word embeddings of the title and one-hot encoding of genres as the node features. To make it a bit more interesting, we will also develop movie node features that encapsulate the similarity of actors and directors. We could, similarly to genres, one-hot encode actors and directors. But instead, we will choose another route to capture movie similarities based on the actors that appeared in the movies. In this example, we will use the FastRP embedding models to produce node embeddings. If you want to learn more about the FastRP algorithm, I suggest you check out [this excellent article](https://towardsdatascience.com/behind-the-scenes-on-the-fast-random-projection-algorithm-for-generating-graph-embeddings-efb1db0895) by my friend CJ Sullivan.\n",
        "The FastRP algorithm will only consider the bipartite network of movies and persons and ignore genres and ratings. This way, we make sure to capture the movie similarity based on only the actors and directors that appeared in the movie. First, we need to project the GDS in-memory graph."
      ],
      "metadata": {
        "id": "MvXnD-BLgTki"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "hzMPQPQZ0Iqs",
        "outputId": "77e9eff7-1976-431b-9c4e-f547de0c245f",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 81
        }
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "\n",
              "  <div id=\"df-9fa45bf9-648c-4d08-b1dc-477b15fa53fe\">\n",
              "    <div class=\"colab-df-container\">\n",
              "      <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>nodeProjection</th>\n",
              "      <th>relationshipProjection</th>\n",
              "      <th>graphName</th>\n",
              "      <th>nodeCount</th>\n",
              "      <th>relationshipCount</th>\n",
              "      <th>createMillis</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>{'Movie': {'properties': {}, 'label': 'Movie'}...</td>\n",
              "      <td>{'DIRECTED': {'orientation': 'UNDIRECTED', 'ag...</td>\n",
              "      <td>movies</td>\n",
              "      <td>28172</td>\n",
              "      <td>91834</td>\n",
              "      <td>172</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-9fa45bf9-648c-4d08-b1dc-477b15fa53fe')\"\n",
              "              title=\"Convert this dataframe to an interactive table.\"\n",
              "              style=\"display:none;\">\n",
              "        \n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
              "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
              "  </svg>\n",
              "      </button>\n",
              "      \n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      flex-wrap:wrap;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "      <script>\n",
              "        const buttonEl =\n",
              "          document.querySelector('#df-9fa45bf9-648c-4d08-b1dc-477b15fa53fe button.colab-df-convert');\n",
              "        buttonEl.style.display =\n",
              "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "        async function convertToInteractive(key) {\n",
              "          const element = document.querySelector('#df-9fa45bf9-648c-4d08-b1dc-477b15fa53fe');\n",
              "          const dataTable =\n",
              "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                     [key], {});\n",
              "          if (!dataTable) return;\n",
              "\n",
              "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "            + ' to learn more about interactive tables.';\n",
              "          element.innerHTML = '';\n",
              "          dataTable['output_type'] = 'display_data';\n",
              "          await google.colab.output.renderOutput(dataTable, element);\n",
              "          const docLink = document.createElement('div');\n",
              "          docLink.innerHTML = docLinkHtml;\n",
              "          element.appendChild(docLink);\n",
              "        }\n",
              "      </script>\n",
              "    </div>\n",
              "  </div>\n",
              "  "
            ],
            "text/plain": [
              "                                      nodeProjection  ... createMillis\n",
              "0  {'Movie': {'properties': {}, 'label': 'Movie'}...  ...          172\n",
              "\n",
              "[1 rows x 6 columns]"
            ]
          },
          "metadata": {},
          "execution_count": 4
        }
      ],
      "source": [
        "fetch_data(\"\"\"\n",
        "CALL gds.graph.project('movies', ['Movie', 'Person'], \n",
        "  {ACTED_IN: {orientation:'UNDIRECTED'}, DIRECTED: {orientation:'UNDIRECTED'}})\n",
        "\"\"\")"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Now we can go ahead and execute the FastRP algorithm on the projected graph and store the results back in the database."
      ],
      "metadata": {
        "id": "P_fIiLGBgiOa"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "a4YBjJPk0Iqt",
        "outputId": "1ed048d8-7ce7-44ae-c63a-59b359665280",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 81
        }
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "\n",
              "  <div id=\"df-537ecc88-cd93-4058-bebb-da389c19c541\">\n",
              "    <div class=\"colab-df-container\">\n",
              "      <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>nodeCount</th>\n",
              "      <th>nodePropertiesWritten</th>\n",
              "      <th>createMillis</th>\n",
              "      <th>computeMillis</th>\n",
              "      <th>writeMillis</th>\n",
              "      <th>configuration</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>28172</td>\n",
              "      <td>28172</td>\n",
              "      <td>0</td>\n",
              "      <td>394</td>\n",
              "      <td>1322</td>\n",
              "      <td>{'writeConcurrency': 4, 'normalizationStrength...</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-537ecc88-cd93-4058-bebb-da389c19c541')\"\n",
              "              title=\"Convert this dataframe to an interactive table.\"\n",
              "              style=\"display:none;\">\n",
              "        \n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
              "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
              "  </svg>\n",
              "      </button>\n",
              "      \n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      flex-wrap:wrap;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "      <script>\n",
              "        const buttonEl =\n",
              "          document.querySelector('#df-537ecc88-cd93-4058-bebb-da389c19c541 button.colab-df-convert');\n",
              "        buttonEl.style.display =\n",
              "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "        async function convertToInteractive(key) {\n",
              "          const element = document.querySelector('#df-537ecc88-cd93-4058-bebb-da389c19c541');\n",
              "          const dataTable =\n",
              "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                     [key], {});\n",
              "          if (!dataTable) return;\n",
              "\n",
              "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "            + ' to learn more about interactive tables.';\n",
              "          element.innerHTML = '';\n",
              "          dataTable['output_type'] = 'display_data';\n",
              "          await google.colab.output.renderOutput(dataTable, element);\n",
              "          const docLink = document.createElement('div');\n",
              "          docLink.innerHTML = docLinkHtml;\n",
              "          element.appendChild(docLink);\n",
              "        }\n",
              "      </script>\n",
              "    </div>\n",
              "  </div>\n",
              "  "
            ],
            "text/plain": [
              "   nodeCount  ...                                      configuration\n",
              "0      28172  ...  {'writeConcurrency': 4, 'normalizationStrength...\n",
              "\n",
              "[1 rows x 6 columns]"
            ]
          },
          "metadata": {},
          "execution_count": 5
        }
      ],
      "source": [
        "fetch_data(\"\"\"\n",
        "CALL gds.fastRP.write('movies', {writeProperty:'fastrp', embeddingDimension:56})\n",
        "\"\"\")"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "After executing the FastRP algorithm, each movie node has a node property fastrp that contains the embeddings that encapsulate the similarity based on the present actors and directors.\n",
        "## Export Neo4j Graph and construct a heterogeneous pyG graph\n",
        "I've taken a lot of inspiration for constructing a custom heterogenous pyG graph from this example. The example creates a pyG graph from multiple CSV files. I have simply rewritten the example to fetch the data from Neo4j instead of CSV files.\n",
        "The generic function to create node mapping and features while retrieving data from Neo4j is the following:"
      ],
      "metadata": {
        "id": "MaZtKz-FgkdL"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bX-Dlugy0Fyu"
      },
      "outputs": [],
      "source": [
        "def load_node(cypher, index_col, encoders=None, **kwargs):\n",
        "    # Execute the cypher query and retrieve data from Neo4j\n",
        "    df = fetch_data(cypher)\n",
        "    df.set_index(index_col, inplace=True)\n",
        "    # Define node mapping\n",
        "    mapping = {index: i for i, index in enumerate(df.index.unique())}\n",
        "    # Define node features\n",
        "    x = None\n",
        "    if encoders is not None:\n",
        "        xs = [encoder(df[col]) for col, encoder in encoders.items()]\n",
        "        x = torch.cat(xs, dim=-1)\n",
        "\n",
        "    return x, mapping"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "And similarly, the function to create edge index and features is:"
      ],
      "metadata": {
        "id": "Q-g5CW_AgnNQ"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "b-QNMfvN3tk9"
      },
      "outputs": [],
      "source": [
        "def load_edge(cypher, src_index_col, src_mapping, dst_index_col, dst_mapping,\n",
        "                  encoders=None, **kwargs):\n",
        "    # Execute the cypher query and retrieve data from Neo4j\n",
        "    df = fetch_data(cypher)\n",
        "    # Define edge index\n",
        "    src = [src_mapping[index] for index in df[src_index_col]]\n",
        "    dst = [dst_mapping[index] for index in df[dst_index_col]]\n",
        "    edge_index = torch.tensor([src, dst])\n",
        "    # Define edge features\n",
        "    edge_attr = None\n",
        "    if encoders is not None:\n",
        "        edge_attrs = [encoder(df[col]) for col, encoder in encoders.items()]\n",
        "        edge_attr = torch.cat(edge_attrs, dim=-1)\n",
        "\n",
        "    return edge_index, edge_attr"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "As mentioned, the code is almost identical to the pyG example. I've just changed that the Pandas DataFrame is constructed from data retrieved from Neo4j instead of CSV files. In the next step, we have to define the feature encoders."
      ],
      "metadata": {
        "id": "_guLryc1gqng"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "8xF_x6SZ3wIy"
      },
      "outputs": [],
      "source": [
        "class SequenceEncoder(object):\n",
        "    # The 'SequenceEncoder' encodes raw column strings into embeddings.\n",
        "    def __init__(self, model_name='all-MiniLM-L6-v2', device=None):\n",
        "        self.device = device\n",
        "        self.model = SentenceTransformer(model_name, device=device)\n",
        "\n",
        "    @torch.no_grad()\n",
        "    def __call__(self, df):\n",
        "        x = self.model.encode(df.values, show_progress_bar=True,\n",
        "                              convert_to_tensor=True, device=self.device)\n",
        "        return x.cpu()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "B3MrEGO933bA"
      },
      "outputs": [],
      "source": [
        "class GenresEncoder(object):\n",
        "    # The 'GenreEncoder' splits the raw column strings by 'sep' and converts\n",
        "    # individual elements to categorical labels.\n",
        "    def __init__(self, sep='|'):\n",
        "        self.sep = sep\n",
        "\n",
        "    def __call__(self, df):\n",
        "        genres = set(g for col in df.values for g in col.split(self.sep))\n",
        "        mapping = {genre: i for i, genre in enumerate(genres)}\n",
        "\n",
        "        x = torch.zeros(len(df), len(mapping))\n",
        "        for i, col in enumerate(df.values):\n",
        "            for genre in col.split(self.sep):\n",
        "                x[i, mapping[genre]] = 1\n",
        "        return x"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "n1QiEzKZ348J"
      },
      "outputs": [],
      "source": [
        "class IdentityEncoder(object):\n",
        "    # The 'IdentityEncoder' takes the raw column values and converts them to\n",
        "    # PyTorch tensors.\n",
        "    def __init__(self, dtype=None, is_list=False):\n",
        "        self.dtype = dtype\n",
        "        self.is_list = is_list\n",
        "\n",
        "    def __call__(self, df):\n",
        "        if self.is_list:\n",
        "            return torch.stack([torch.tensor(el) for el in df.values])\n",
        "        return torch.from_numpy(df.values).to(self.dtype)"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Finally, we can fetch the data from Neo4j and construct user mappings and features that will be used as input to the pyG heterogeneous graph. We will begin by constructing the user nodes input. They have no node features available, so we don't have to include any encoders."
      ],
      "metadata": {
        "id": "S28rnWmzgvO0"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "9a3plIYf74tX"
      },
      "outputs": [],
      "source": [
        "user_query = \"\"\"\n",
        "MATCH (u:User) RETURN u.userId AS userId\n",
        "\"\"\"\n",
        "\n",
        "user_x, user_mapping = load_node(user_query, index_col='userId')"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Next, we will construct the movie's mapping and features."
      ],
      "metadata": {
        "id": "a2J0ZBCUgxmI"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 497,
          "referenced_widgets": [
            "2ed7832a3aa645da863d301e7b46200d",
            "b328acaed7674f31a2b2e63c33689a1e",
            "49c61d34cac0437ea23db3c5b02bda92",
            "4190e2c5194e4c1d940701a2c543df14",
            "9dabb8d8822f4d85a82a0fbb2e86f384",
            "c4bea143b2ed42a4acfbc11c9d18faa5",
            "b0be35e10de74941841a1de658dd6b7c",
            "9a0cfbecdba84a8882dc439ef93cd727",
            "f46b23bb69324124a023d6c03887a056",
            "76161e4c40514ea6aa60375e01ef5200",
            "9ffe3dbbed084d0d88c7cb9a9f237787",
            "7343ea337d084b4b8d7660e3938a14bd",
            "3009e58aeb5a44538ebd0314c6daa270",
            "3ca707d5a50844f9ad49d0a86c27f536",
            "12af7f8432e04797bbe59cf663cf9c8a",
            "1261ca6912af40889e75048542d34276",
            "17065eadc68f43c4a39d077c0d056485",
            "d0ad530de9e64eafb0799c93c1197463",
            "f32a86aee66c4b1d994c52819fbf5cd9",
            "2c494faeb567413aa0a791ed5c49e101",
            "21ba40cb78d843f3afd11e18ab409297",
            "64b01488aeea447b841f48af79b7b552",
            "dfbd87574a194f37b5f9e9b23f8f3927",
            "8e3962421296400fab6252aad3f4ccd6",
            "143a092b5e5445d9b6527c9cd1d5caad",
            "e0f26c1d4eb64eeb93ab55b4c2130c75",
            "d01d031f25e74fb6a8a8b86efadb17e3",
            "3e11f7cd93b7483597cd2e3aae549aa2",
            "26a8c64f7c864e33accc3332fdc4713f",
            "0e628a4f28824ee7a3c8c6b78e5cf627",
            "d95e49a82e1945288e6954a50487168a",
            "debc5f3e48e944a190af7273baaccb7c",
            "584017342dbb4df297ce3ab7fbcd465f",
            "54aafa4efb6f40ccabe1ddb9e213fb6b",
            "680659a48868456897457f2886520825",
            "45ae42d3912441288b2f1ab50eb6b9eb",
            "7ce04de377df4153ad6a6105bc1044a4",
            "f27a779f650c463dbd57eea31d5934fa",
            "93b512cb9a134089b35a0515d1a590bf",
            "8b6424e75ad14d41a9e56206a48312b6",
            "02062490132c4340825e2810863b0aa3",
            "83c44afc625642469f264dbd28107f29",
            "808d58c5ed084ed683e7f9f8af82fa3c",
            "5df8e4cb82444212a6aef84cff89fd66",
            "99cba8de59134c599c5474d1963a9aad",
            "fe777b0f308a492aad01e24209377412",
            "72a9d8396431419db860ec8ec9059fc5",
            "8d2564e7c2b84554aa9bca881b9b2828",
            "6d912a85a6f244faa7bd931c59994a20",
            "42806007d52645e8b5434338aa428df9",
            "44c07baf2bf74f3b8c7e339ec2a76f8c",
            "8b40f1b97772403283ff38861d801acb",
            "5588345ca8f44088ac4a50db2df580dc",
            "92d1240ede3341eaa5634225c1bf9006",
            "719929847ba1413496e1eba5556c17e8",
            "ce01920df03b4cdd9728f723ffbc5734",
            "5f6de51db8134bd29af33d25d494cfe2",
            "bcbffddc7f35428e9451aa45ab202538",
            "74ad696a528447caa9fd880877b03caa",
            "4ac9cea778ea4e2db682ac5e94ac655e",
            "5b03671271d043e98397118c3bb0be58",
            "8891bc65a12f4cca964d182c66849f8d",
            "e0765df4f3634bffa11b10ad23ef996a",
            "88f6ad2e4006448fb3eca9a79e12f1ee",
            "f90af6b2f2024e599faafbe2a1922e27",
            "d728ba0185644fa88594dc4dae4efea5",
            "8d41059822434abc945f543b7aae387f",
            "14267d1b68e344aaaf5118bd3b154765",
            "5ea31c011b9a40fda353e14f57e86f2b",
            "f88361401a00477cacf61aaa49473fe4",
            "7390d68bc8a14810879bd6b41c4b1137",
            "ff65f3cdf71044fda5f0dfc0a0221d89",
            "6f847c67f78945d69e2d3f97ec718e3b",
            "5481dc16e39d4a61be7d74302e9e9e17",
            "81ee9503cb634c5ead7cca948821eb84",
            "29de7cec1aca4ab0a5f6716936699bb4",
            "cc750ec1c06e4942834ddf9b1c84921b",
            "27dfebe112db405aae24af245f21d7d9",
            "a810985fe380471eb0e46d13a2ddb6c1",
            "955e77fd457342c9a02883aba817e07c",
            "7c81c9420fba4035906273ef1a1c3abf",
            "66c0871323e846538679d431ac115866",
            "4b19e2a4cc1245fdbf065d08d67127ec",
            "3ecd52a8cb894df483b54d1293b24580",
            "c3eb72af8817454fb25993d6168a84c2",
            "2137e0d7eeb246b8a1f33074ce97aa26",
            "6cd4327d84a44cf8abb44af93854c413",
            "1f59507b0914472f8eb9497580e6d1bf",
            "821ef8a0ca3e4e1993448f158a7db0cc",
            "b2e11df92e5342118b2b1c71048fe0ed",
            "7e40c49b4f12434e9d87e9e14bee0feb",
            "2b6c7346d9ce4d91be1202df59acf5b4",
            "2748df33b52d4170b0b560489a55f8fd",
            "96121a5bc2954046bdc3c2991d5acb83",
            "eec4b0817dfc4dbaab4f9cc251d4abed",
            "ee812707b7844ef4913ab7b9ced0c1d3",
            "f7b59d4d0a11436586e304f771f04747",
            "e3b1bc91a3f842e1aff9c9a35477f1b4",
            "be1065f32019490daf4308f40fdb985f",
            "ce2a2f44070042a8bda93f270ea14685",
            "2362d756479841a1b1ef3c3db62ec373",
            "52300692bd0d4477943e8ee14e9ebc0a",
            "dfe0487e11df41ba824b455dd20a163e",
            "807a1afb5e964c05b55f53b774317cbe",
            "9e1f8cecab994168a7144fc5fda92cec",
            "018a6a8c852f4a00bb97e8d315d51d4d",
            "482df50efb424fc1bd59abf3af1821c0",
            "8f3c3d5cce1a4d109088c876e8b62c2c",
            "8b86ebf95d5d4d1ebd270d7b796b64db",
            "88641bcef133475da85ca5edb2d474e6",
            "84b016393ee14e10beb19fbe29d672e0",
            "99195e3d6b6f4dbaa4470e881ae3cb28",
            "c0dae58679744a6fbf6a23756d92074d",
            "ccff1b17e7494d65975462f521298c35",
            "e71b9c290b3a48b4a5db2b8439ea87b4",
            "c9ae3ab14562473db2688cc1b1396647",
            "20aeadb8971f45448b36c6e7066639a4",
            "1db1a67451fd452a99e8e81d8be40b6d",
            "2d08c18e0efa4b69b18f7177355d6585",
            "79bbad52e1994306a9a7f1fc1322321c",
            "171dd30a9b6849ba9947a974cdc3c25e",
            "0e9debf346324eae9cad0485ef372b1b",
            "1c39c7562d57447cb03bdc454d98ee0d",
            "39593e2deb634b2e87bbf56033066baf",
            "70de1787cd5345959ae486369657ccaf",
            "d0b96d48773c49e1a7248c4a1ebd7b2a",
            "92106cec5aba40a28576b988156c93a1",
            "a4b557bbae6c44939decb80751d395aa",
            "2ac88ec0505c4fbbabd07d324b7f0f1d",
            "4917d9fd31b04a4dacefc7c9d05b28fd",
            "d97fb575f4764d7caaf65f04c8517dd0",
            "035aeb3050e14f299e8a5e0272b4a111",
            "da6f659f6d744b25bf4b56a9269cc486",
            "c8db05fab59c4d8d911992054ff848d3",
            "b3870b7d62ad485482721bf7f2ef53b4",
            "97301f4dfde04a61baad54812e67398c",
            "eb54de7fad6743369fd3f92b04135603",
            "e5b2ae09244f49598a172c7911374be5",
            "65a327a83e844bb2b5b476c40a791819",
            "eabbaef67f0c4f8792b66a3417001860",
            "2101faad91694927b081ef9fa2ef463b",
            "f551d22d6e824ebba76bfdc42b0ba0c4",
            "6a12024c06404c7fb91108c143dc9e64",
            "61fc9abeca84445b9177b2577bc97497",
            "8ee15cb5d3914244bb2b87b32e7e7867",
            "ecf93ceaa6d74a2cb54bb539305cc63a",
            "6447255d6e324b5e866b19093885f7e8",
            "e37a6efdf41d41a08580356f3dd73878",
            "3ee8975e95c9433585354289010773e4",
            "2dc479a29b1d424c9bbd3508220339e2",
            "c378f823b322454ba92dad95ea3db7a9",
            "906ec2c14d7f4ef2a072c5ba5c153659",
            "b4413a497196483c8bcf8dd80b60760b",
            "8cbdcc45e9884fdd86c1e068f5e20c31",
            "2ac16e40276d4ae9b523bf43d6a722e6",
            "4a562a71af824db7b49b4b8139a22985",
            "6d353e3a6e6b4c7bac6c4863ac9997dd",
            "a4ec1486d64c4151bf116b195f81b931",
            "59f38ca6aaa640dab47ae5a582209b6b",
            "5c812352f3704787bbb985760a65ed60",
            "11c4975942fe4977928bc86d7555d2a6",
            "0129c883f97f42e7933be2887a92b7dd",
            "85908791490a4cb681f07c35499b5cb4",
            "85086e756f92412cb6eb5da1261568bd",
            "b9f7834f1e2d4371a67aebea10a2d1ca"
          ]
        },
        "id": "ORpJYlwD89K6",
        "outputId": "e4b19799-3df2-4e7d-c1d0-d9bc92e6a862"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "2ed7832a3aa645da863d301e7b46200d",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/1.18k [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "7343ea337d084b4b8d7660e3938a14bd",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/10.2k [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "dfbd87574a194f37b5f9e9b23f8f3927",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/612 [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "54aafa4efb6f40ccabe1ddb9e213fb6b",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/116 [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "99cba8de59134c599c5474d1963a9aad",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/39.3k [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "ce01920df03b4cdd9728f723ffbc5734",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/349 [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "8d41059822434abc945f543b7aae387f",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/90.9M [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "27dfebe112db405aae24af245f21d7d9",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/53.0 [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "821ef8a0ca3e4e1993448f158a7db0cc",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/112 [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "ce2a2f44070042a8bda93f270ea14685",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/466k [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "84b016393ee14e10beb19fbe29d672e0",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/350 [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "0e9debf346324eae9cad0485ef372b1b",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/13.2k [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "da6f659f6d744b25bf4b56a9269cc486",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/232k [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "61fc9abeca84445b9177b2577bc97497",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Downloading:   0%|          | 0.00/190 [00:00<?, ?B/s]"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "2ac16e40276d4ae9b523bf43d6a722e6",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "Batches:   0%|          | 0/286 [00:00<?, ?it/s]"
            ]
          },
          "metadata": {}
        }
      ],
      "source": [
        "movie_query = \"\"\"\n",
        "MATCH (m:Movie)-[:IN_GENRE]->(genre:Genre)\n",
        "WITH m, collect(genre.name) AS genres_list\n",
        "RETURN m.movieId AS movieId, m.title AS title, apoc.text.join(genres_list, '|') AS genres, m.fastrp AS fastrp\n",
        "\"\"\"\n",
        "\n",
        "movie_x, movie_mapping = load_node(\n",
        "    movie_query, \n",
        "    index_col='movieId', encoders={\n",
        "        'title': SequenceEncoder(),\n",
        "        'genres': GenresEncoder(),\n",
        "        'fastrp': IdentityEncoder(is_list=True)\n",
        "    })"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "With the movies, we have several node features. First, the Sequence encoder uses the sentence-transformers library to produce word embeddings based on the titles. The genres are one-hot-encoded using the Genre encoder, and lastly, we simply transform the FastRP embeddings into the correct structure to be able to use them in PyTorch Geometric.\n",
        "\n",
        "Before we can construct the pyG graph, we have to fetch the information about the ratings, which are represented as weighted links between users and movies."
      ],
      "metadata": {
        "id": "O_ExpLGMg0Ww"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "tR4B7auh9_bu"
      },
      "outputs": [],
      "source": [
        "rating_query = \"\"\"\n",
        "MATCH (u:User)-[r:RATED]->(m:Movie) \n",
        "RETURN u.userId AS userId, m.movieId AS movieId, r.rating AS rating\n",
        "\"\"\"\n",
        "\n",
        "edge_index, edge_label = load_edge(\n",
        "    rating_query,\n",
        "    src_index_col='userId',\n",
        "    src_mapping=user_mapping,\n",
        "    dst_index_col='movieId',\n",
        "    dst_mapping=movie_mapping,\n",
        "    encoders={'rating': IdentityEncoder(dtype=torch.long)},\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "We have all the information we require. So now, we can go ahead and build a heterogeneous pyG graph. In a heterogeneous graph, distinct types of nodes contain different features."
      ],
      "metadata": {
        "id": "Gm4_Zcpgg20W"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "v5WEVdiz_Xai",
        "outputId": "00193026-21e2-4d17-ebf1-09fbb52f81c3"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "HeteroData(\n",
              "  \u001b[1muser\u001b[0m={ x=[671, 671] },\n",
              "  \u001b[1mmovie\u001b[0m={ x=[9125, 460] },\n",
              "  \u001b[1m(user, rates, movie)\u001b[0m={\n",
              "    edge_index=[2, 100004],\n",
              "    edge_label=[100004]\n",
              "  }\n",
              ")"
            ]
          },
          "metadata": {},
          "execution_count": 25
        }
      ],
      "source": [
        "data = HeteroData()\n",
        "# Add user node features for message passing:\n",
        "data['user'].x = torch.eye(len(user_mapping), device=device)\n",
        "# Add movie node features\n",
        "data['movie'].x = movie_x\n",
        "# Add ratings between users and movies\n",
        "data['user', 'rates', 'movie'].edge_index = edge_index\n",
        "data['user', 'rates', 'movie'].edge_label = edge_label\n",
        "data.to(device, non_blocking=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "The process of constructing a heterogeneous pyG graph seems easy enough. First, we define node features of each node type and then add any relationships between those nodes. Remember, the GNNs require all of the nodes to contain node features. So here is one example of what you could do for user nodes with no pre-existing features.\n",
        "\n",
        "As with all the Machine Learning flows, we have to perform the train/test data split. The pyG library makes this very easy with the RandomLinkSplit method."
      ],
      "metadata": {
        "id": "T1BrZObyg6Ni"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "wWPosXvc_nYk"
      },
      "outputs": [],
      "source": [
        "data = ToUndirected()(data)\n",
        "del data['movie', 'rev_rates', 'user'].edge_label  # Remove \"reverse\" label.\n",
        "\n",
        "# 2. Perform a link-level split into training, validation, and test edges.\n",
        "transform = RandomLinkSplit(\n",
        "    num_val=0.1,\n",
        "    num_test=0.1,\n",
        "    neg_sampling_ratio=0.0,\n",
        "    edge_types=[('user', 'rates', 'movie')],\n",
        "    rev_edge_types=[('movie', 'rev_rates', 'user')],\n",
        ")\n",
        "train_data, val_data, test_data = transform(data)"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "The pyG graph is prepared. Now, we can go ahead and define our GNN. I have simply copied the definition from the pyG example. The GNN will predict ratings between 0 and 5 of movies by users. We can think of that as a link prediction task, where we are predicting the relationship property of new links between users and movies. Once we have defined the GNN, we can go ahead and train our model."
      ],
      "metadata": {
        "id": "93fFqFDXg-Bi"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "_9p-mP6wAQ9-"
      },
      "outputs": [],
      "source": [
        "class GNNEncoder(torch.nn.Module):\n",
        "    def __init__(self, hidden_channels, out_channels):\n",
        "        super().__init__()\n",
        "        self.conv1 = SAGEConv((-1, -1), hidden_channels)\n",
        "        self.conv2 = SAGEConv((-1, -1), out_channels)\n",
        "\n",
        "    def forward(self, x, edge_index):\n",
        "        x = self.conv1(x, edge_index).relu()\n",
        "        x = self.conv2(x, edge_index)\n",
        "        return x\n",
        "\n",
        "\n",
        "class EdgeDecoder(torch.nn.Module):\n",
        "    def __init__(self, hidden_channels):\n",
        "        super().__init__()\n",
        "        self.lin1 = Linear(2 * hidden_channels, hidden_channels)\n",
        "        self.lin2 = Linear(hidden_channels, 1)\n",
        "\n",
        "    def forward(self, z_dict, edge_label_index):\n",
        "        row, col = edge_label_index\n",
        "        z = torch.cat([z_dict['user'][row], z_dict['movie'][col]], dim=-1)\n",
        "\n",
        "        z = self.lin1(z).relu()\n",
        "        z = self.lin2(z)\n",
        "        return z.view(-1)\n",
        "\n",
        "class Model(torch.nn.Module):\n",
        "    def __init__(self, hidden_channels):\n",
        "        super().__init__()\n",
        "        self.encoder = GNNEncoder(hidden_channels, hidden_channels)\n",
        "        self.encoder = to_hetero(self.encoder, data.metadata(), aggr='sum')\n",
        "        self.decoder = EdgeDecoder(hidden_channels)\n",
        "\n",
        "    def forward(self, x_dict, edge_index_dict, edge_label_index):\n",
        "        z_dict = self.encoder(x_dict, edge_index_dict)\n",
        "        return self.decoder(z_dict, edge_label_index)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "HNT9FX3eAjwt"
      },
      "outputs": [],
      "source": [
        "weight = torch.bincount(train_data['user','rates', 'movie'].edge_label)\n",
        "weight = weight.max() / weight\n",
        "\n",
        "def weighted_mse_loss(pred, target, weight=None):\n",
        "    weight = 1. if weight is None else weight[target].to(pred.dtype)\n",
        "    return (weight * (pred - target.to(pred.dtype)).pow(2)).mean()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "RgPHXNpSAmJ2"
      },
      "outputs": [],
      "source": [
        "model = Model(hidden_channels=64).to(device)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "JLlVrSU8AyxT"
      },
      "outputs": [],
      "source": [
        "# Due to lazy initialization, we need to run one model step so the number\n",
        "# of parameters can be inferred:\n",
        "with torch.no_grad():\n",
        "    model.encoder(train_data.x_dict, train_data.edge_index_dict)\n",
        "\n",
        "optimizer = torch.optim.Adam(model.parameters(), lr=0.01)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "4dJtEPSuBTDI"
      },
      "outputs": [],
      "source": [
        "def train():\n",
        "    model.train()\n",
        "    optimizer.zero_grad()\n",
        "    pred = model(train_data.x_dict, train_data.edge_index_dict,\n",
        "                 train_data['user', 'rates', 'movie'].edge_label_index)\n",
        "    target = train_data['user', 'rates', 'movie'].edge_label\n",
        "    loss = weighted_mse_loss(pred, target, weight)\n",
        "    loss.backward()\n",
        "    optimizer.step()\n",
        "    return float(loss)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "cbRPYOIy0Iq5"
      },
      "outputs": [],
      "source": [
        "@torch.no_grad()\n",
        "def test(data):\n",
        "    model.eval()\n",
        "    pred = model(data.x_dict, data.edge_index_dict,\n",
        "                 data['user', 'rates', 'movie'].edge_label_index)\n",
        "    pred = pred.clamp(min=0, max=5)\n",
        "    target = data['user', 'rates', 'movie'].edge_label.float()\n",
        "    rmse = F.mse_loss(pred, target).sqrt()\n",
        "    return float(rmse)"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Since the dataset is not that big, it shouldn't take long to train the model. If you can, use the GPU mode in the Google Colab environment."
      ],
      "metadata": {
        "id": "j2LmHC08hDXZ"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "gjndb8tPCPRO",
        "outputId": "8efe1353-9d19-490f-a68b-7784f51b87c4"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch: 001, Loss: 19.7843, Train: 3.2615, Val: 3.2684, Test: 3.2474\n",
            "Epoch: 002, Loss: 16.5262, Train: 2.3640, Val: 2.3769, Test: 2.3551\n",
            "Epoch: 003, Loss: 9.3904, Train: 1.1806, Val: 1.1700, Test: 1.1679\n",
            "Epoch: 004, Loss: 10.0532, Train: 1.1701, Val: 1.1806, Test: 1.1639\n",
            "Epoch: 005, Loss: 6.7872, Train: 1.7661, Val: 1.7819, Test: 1.7603\n",
            "Epoch: 006, Loss: 6.7277, Train: 2.0491, Val: 2.0635, Test: 2.0421\n",
            "Epoch: 007, Loss: 7.7062, Train: 1.9760, Val: 1.9906, Test: 1.9696\n",
            "Epoch: 008, Loss: 7.3644, Train: 1.6654, Val: 1.6815, Test: 1.6611\n",
            "Epoch: 009, Loss: 6.3172, Train: 1.2720, Val: 1.2882, Test: 1.2700\n",
            "Epoch: 010, Loss: 5.8945, Train: 1.0770, Val: 1.0887, Test: 1.0755\n",
            "Epoch: 011, Loss: 6.5527, Train: 1.0791, Val: 1.0920, Test: 1.0785\n",
            "Epoch: 012, Loss: 6.3446, Train: 1.2318, Val: 1.2482, Test: 1.2313\n",
            "Epoch: 013, Loss: 5.6389, Train: 1.4683, Val: 1.4845, Test: 1.4665\n",
            "Epoch: 014, Loss: 5.6257, Train: 1.6203, Val: 1.6355, Test: 1.6176\n",
            "Epoch: 015, Loss: 5.8645, Train: 1.6264, Val: 1.6413, Test: 1.6238\n",
            "Epoch: 016, Loss: 5.8212, Train: 1.4978, Val: 1.5133, Test: 1.4967\n",
            "Epoch: 017, Loss: 5.4646, Train: 1.2929, Val: 1.3090, Test: 1.2938\n",
            "Epoch: 018, Loss: 5.1436, Train: 1.1234, Val: 1.1391, Test: 1.1260\n",
            "Epoch: 019, Loss: 5.1831, Train: 1.0665, Val: 1.0811, Test: 1.0697\n",
            "Epoch: 020, Loss: 5.2780, Train: 1.0996, Val: 1.1143, Test: 1.1026\n",
            "Epoch: 021, Loss: 4.9996, Train: 1.2143, Val: 1.2287, Test: 1.2164\n",
            "Epoch: 022, Loss: 4.7213, Train: 1.3554, Val: 1.3686, Test: 1.3560\n",
            "Epoch: 023, Loss: 4.7247, Train: 1.4048, Val: 1.4169, Test: 1.4049\n",
            "Epoch: 024, Loss: 4.7112, Train: 1.3599, Val: 1.3713, Test: 1.3600\n",
            "Epoch: 025, Loss: 4.5409, Train: 1.2432, Val: 1.2535, Test: 1.2435\n",
            "Epoch: 026, Loss: 4.3100, Train: 1.1362, Val: 1.1445, Test: 1.1360\n",
            "Epoch: 027, Loss: 4.2514, Train: 1.1037, Val: 1.1096, Test: 1.1023\n",
            "Epoch: 028, Loss: 4.2815, Train: 1.1345, Val: 1.1393, Test: 1.1319\n",
            "Epoch: 029, Loss: 4.1313, Train: 1.2173, Val: 1.2216, Test: 1.2135\n",
            "Epoch: 030, Loss: 3.9866, Train: 1.3069, Val: 1.3110, Test: 1.3022\n",
            "Epoch: 031, Loss: 4.0033, Train: 1.3339, Val: 1.3372, Test: 1.3282\n",
            "Epoch: 032, Loss: 3.9958, Train: 1.2899, Val: 1.2919, Test: 1.2830\n",
            "Epoch: 033, Loss: 3.9069, Train: 1.2379, Val: 1.2385, Test: 1.2300\n",
            "Epoch: 034, Loss: 3.9098, Train: 1.2295, Val: 1.2300, Test: 1.2214\n",
            "Epoch: 035, Loss: 3.9343, Train: 1.2571, Val: 1.2588, Test: 1.2488\n",
            "Epoch: 036, Loss: 3.8586, Train: 1.3037, Val: 1.3072, Test: 1.2958\n",
            "Epoch: 037, Loss: 3.8347, Train: 1.3210, Val: 1.3260, Test: 1.3138\n",
            "Epoch: 038, Loss: 3.8322, Train: 1.2808, Val: 1.2869, Test: 1.2745\n",
            "Epoch: 039, Loss: 3.7677, Train: 1.2127, Val: 1.2196, Test: 1.2076\n",
            "Epoch: 040, Loss: 3.7323, Train: 1.1812, Val: 1.1893, Test: 1.1774\n",
            "Epoch: 041, Loss: 3.7234, Train: 1.1971, Val: 1.2070, Test: 1.1943\n",
            "Epoch: 042, Loss: 3.6658, Train: 1.2264, Val: 1.2377, Test: 1.2243\n",
            "Epoch: 043, Loss: 3.6472, Train: 1.2288, Val: 1.2412, Test: 1.2277\n",
            "Epoch: 044, Loss: 3.6329, Train: 1.1942, Val: 1.2077, Test: 1.1945\n",
            "Epoch: 045, Loss: 3.5944, Train: 1.1506, Val: 1.1654, Test: 1.1527\n",
            "Epoch: 046, Loss: 3.5767, Train: 1.1354, Val: 1.1514, Test: 1.1390\n",
            "Epoch: 047, Loss: 3.5631, Train: 1.1552, Val: 1.1722, Test: 1.1596\n",
            "Epoch: 048, Loss: 3.5258, Train: 1.1841, Val: 1.2020, Test: 1.1891\n",
            "Epoch: 049, Loss: 3.5090, Train: 1.1861, Val: 1.2051, Test: 1.1921\n",
            "Epoch: 050, Loss: 3.4864, Train: 1.1575, Val: 1.1778, Test: 1.1651\n",
            "Epoch: 051, Loss: 3.4511, Train: 1.1360, Val: 1.1576, Test: 1.1450\n",
            "Epoch: 052, Loss: 3.4307, Train: 1.1487, Val: 1.1710, Test: 1.1579\n",
            "Epoch: 053, Loss: 3.3945, Train: 1.1786, Val: 1.2012, Test: 1.1874\n",
            "Epoch: 054, Loss: 3.3712, Train: 1.1653, Val: 1.1896, Test: 1.1754\n",
            "Epoch: 055, Loss: 3.3358, Train: 1.1438, Val: 1.1704, Test: 1.1555\n",
            "Epoch: 056, Loss: 3.3090, Train: 1.1539, Val: 1.1823, Test: 1.1664\n",
            "Epoch: 057, Loss: 3.2789, Train: 1.1709, Val: 1.2009, Test: 1.1839\n",
            "Epoch: 058, Loss: 3.2508, Train: 1.1601, Val: 1.1928, Test: 1.1746\n",
            "Epoch: 059, Loss: 3.2198, Train: 1.1424, Val: 1.1782, Test: 1.1590\n",
            "Epoch: 060, Loss: 3.1944, Train: 1.1451, Val: 1.1827, Test: 1.1632\n",
            "Epoch: 061, Loss: 3.1684, Train: 1.1552, Val: 1.1946, Test: 1.1747\n",
            "Epoch: 062, Loss: 3.1444, Train: 1.1410, Val: 1.1833, Test: 1.1628\n",
            "Epoch: 063, Loss: 3.1196, Train: 1.1369, Val: 1.1817, Test: 1.1602\n",
            "Epoch: 064, Loss: 3.0983, Train: 1.1472, Val: 1.1930, Test: 1.1713\n",
            "Epoch: 065, Loss: 3.0765, Train: 1.1360, Val: 1.1832, Test: 1.1621\n",
            "Epoch: 066, Loss: 3.0527, Train: 1.1258, Val: 1.1742, Test: 1.1541\n",
            "Epoch: 067, Loss: 3.0303, Train: 1.1341, Val: 1.1827, Test: 1.1635\n",
            "Epoch: 068, Loss: 3.0089, Train: 1.1213, Val: 1.1716, Test: 1.1530\n",
            "Epoch: 069, Loss: 2.9874, Train: 1.1186, Val: 1.1701, Test: 1.1521\n",
            "Epoch: 070, Loss: 2.9668, Train: 1.1291, Val: 1.1807, Test: 1.1634\n",
            "Epoch: 071, Loss: 2.9482, Train: 1.1119, Val: 1.1655, Test: 1.1491\n",
            "Epoch: 072, Loss: 2.9303, Train: 1.1240, Val: 1.1774, Test: 1.1618\n",
            "Epoch: 073, Loss: 2.9111, Train: 1.1145, Val: 1.1697, Test: 1.1545\n",
            "Epoch: 074, Loss: 2.8915, Train: 1.1131, Val: 1.1696, Test: 1.1543\n",
            "Epoch: 075, Loss: 2.8715, Train: 1.1194, Val: 1.1768, Test: 1.1618\n",
            "Epoch: 076, Loss: 2.8526, Train: 1.1019, Val: 1.1615, Test: 1.1468\n",
            "Epoch: 077, Loss: 2.8356, Train: 1.1366, Val: 1.1948, Test: 1.1803\n",
            "Epoch: 078, Loss: 2.8290, Train: 1.0553, Val: 1.1180, Test: 1.1034\n",
            "Epoch: 079, Loss: 2.8581, Train: 1.1836, Val: 1.2377, Test: 1.2231\n",
            "Epoch: 080, Loss: 2.8775, Train: 1.0723, Val: 1.1327, Test: 1.1171\n",
            "Epoch: 081, Loss: 2.7910, Train: 1.0498, Val: 1.1121, Test: 1.0963\n",
            "Epoch: 082, Loss: 2.8095, Train: 1.1537, Val: 1.2106, Test: 1.1953\n",
            "Epoch: 083, Loss: 2.8043, Train: 1.0995, Val: 1.1608, Test: 1.1455\n",
            "Epoch: 084, Loss: 2.7420, Train: 1.0488, Val: 1.1144, Test: 1.0997\n",
            "Epoch: 085, Loss: 2.7837, Train: 1.1486, Val: 1.2088, Test: 1.1949\n",
            "Epoch: 086, Loss: 2.7563, Train: 1.0968, Val: 1.1599, Test: 1.1461\n",
            "Epoch: 087, Loss: 2.7070, Train: 1.0498, Val: 1.1166, Test: 1.1022\n",
            "Epoch: 088, Loss: 2.7332, Train: 1.1219, Val: 1.1851, Test: 1.1703\n",
            "Epoch: 089, Loss: 2.7015, Train: 1.1021, Val: 1.1672, Test: 1.1519\n",
            "Epoch: 090, Loss: 2.6779, Train: 1.0440, Val: 1.1132, Test: 1.0976\n",
            "Epoch: 091, Loss: 2.6944, Train: 1.0999, Val: 1.1663, Test: 1.1515\n",
            "Epoch: 092, Loss: 2.6578, Train: 1.1006, Val: 1.1682, Test: 1.1536\n",
            "Epoch: 093, Loss: 2.6478, Train: 1.0419, Val: 1.1144, Test: 1.0992\n",
            "Epoch: 094, Loss: 2.6565, Train: 1.0961, Val: 1.1669, Test: 1.1523\n",
            "Epoch: 095, Loss: 2.6245, Train: 1.0805, Val: 1.1531, Test: 1.1387\n",
            "Epoch: 096, Loss: 2.6088, Train: 1.0416, Val: 1.1171, Test: 1.1027\n",
            "Epoch: 097, Loss: 2.6184, Train: 1.1288, Val: 1.1990, Test: 1.1856\n",
            "Epoch: 098, Loss: 2.6375, Train: 1.0252, Val: 1.1012, Test: 1.0866\n",
            "Epoch: 099, Loss: 2.6149, Train: 1.0663, Val: 1.1408, Test: 1.1267\n",
            "Epoch: 100, Loss: 2.5720, Train: 1.1003, Val: 1.1743, Test: 1.1609\n",
            "Epoch: 101, Loss: 2.5828, Train: 1.0201, Val: 1.0998, Test: 1.0860\n",
            "Epoch: 102, Loss: 2.5934, Train: 1.0934, Val: 1.1700, Test: 1.1576\n",
            "Epoch: 103, Loss: 2.5583, Train: 1.0563, Val: 1.1355, Test: 1.1225\n",
            "Epoch: 104, Loss: 2.5318, Train: 1.0321, Val: 1.1128, Test: 1.0996\n",
            "Epoch: 105, Loss: 2.5360, Train: 1.0962, Val: 1.1731, Test: 1.1621\n",
            "Epoch: 106, Loss: 2.5423, Train: 1.0199, Val: 1.1016, Test: 1.0887\n",
            "Epoch: 107, Loss: 2.5289, Train: 1.0650, Val: 1.1450, Test: 1.1338\n",
            "Epoch: 108, Loss: 2.5011, Train: 1.0587, Val: 1.1401, Test: 1.1290\n",
            "Epoch: 109, Loss: 2.4898, Train: 1.0225, Val: 1.1061, Test: 1.0948\n",
            "Epoch: 110, Loss: 2.4934, Train: 1.0862, Val: 1.1660, Test: 1.1582\n",
            "Epoch: 111, Loss: 2.4990, Train: 1.0116, Val: 1.0969, Test: 1.0855\n",
            "Epoch: 112, Loss: 2.4938, Train: 1.0798, Val: 1.1617, Test: 1.1535\n",
            "Epoch: 113, Loss: 2.4753, Train: 1.0180, Val: 1.1030, Test: 1.0930\n",
            "Epoch: 114, Loss: 2.4546, Train: 1.0456, Val: 1.1301, Test: 1.1216\n",
            "Epoch: 115, Loss: 2.4356, Train: 1.0486, Val: 1.1343, Test: 1.1261\n",
            "Epoch: 116, Loss: 2.4285, Train: 1.0155, Val: 1.1024, Test: 1.0942\n",
            "Epoch: 117, Loss: 2.4275, Train: 1.0738, Val: 1.1570, Test: 1.1521\n",
            "Epoch: 118, Loss: 2.4422, Train: 0.9933, Val: 1.0828, Test: 1.0714\n",
            "Epoch: 119, Loss: 2.4765, Train: 1.1160, Val: 1.2002, Test: 1.1944\n",
            "Epoch: 120, Loss: 2.4904, Train: 0.9741, Val: 1.0614, Test: 1.0508\n",
            "Epoch: 121, Loss: 2.4878, Train: 1.0507, Val: 1.1328, Test: 1.1274\n",
            "Epoch: 122, Loss: 2.4194, Train: 1.0585, Val: 1.1481, Test: 1.1396\n",
            "Epoch: 123, Loss: 2.3978, Train: 0.9912, Val: 1.0838, Test: 1.0719\n",
            "Epoch: 124, Loss: 2.4576, Train: 1.1017, Val: 1.1886, Test: 1.1843\n",
            "Epoch: 125, Loss: 2.4399, Train: 0.9873, Val: 1.0775, Test: 1.0695\n",
            "Epoch: 126, Loss: 2.3977, Train: 1.0049, Val: 1.0953, Test: 1.0877\n",
            "Epoch: 127, Loss: 2.3592, Train: 1.0801, Val: 1.1709, Test: 1.1646\n",
            "Epoch: 128, Loss: 2.3885, Train: 0.9914, Val: 1.0876, Test: 1.0751\n",
            "Epoch: 129, Loss: 2.3884, Train: 1.0358, Val: 1.1302, Test: 1.1224\n",
            "Epoch: 130, Loss: 2.3274, Train: 1.0323, Val: 1.1241, Test: 1.1181\n",
            "Epoch: 131, Loss: 2.3341, Train: 0.9804, Val: 1.0769, Test: 1.0656\n",
            "Epoch: 132, Loss: 2.3606, Train: 1.0712, Val: 1.1654, Test: 1.1596\n",
            "Epoch: 133, Loss: 2.3455, Train: 1.0006, Val: 1.0986, Test: 1.0892\n",
            "Epoch: 134, Loss: 2.2965, Train: 0.9920, Val: 1.0898, Test: 1.0816\n",
            "Epoch: 135, Loss: 2.2884, Train: 1.0392, Val: 1.1349, Test: 1.1291\n",
            "Epoch: 136, Loss: 2.2978, Train: 0.9869, Val: 1.0880, Test: 1.0756\n",
            "Epoch: 137, Loss: 2.3043, Train: 1.0384, Val: 1.1373, Test: 1.1295\n",
            "Epoch: 138, Loss: 2.2730, Train: 0.9985, Val: 1.0962, Test: 1.0887\n",
            "Epoch: 139, Loss: 2.2498, Train: 0.9734, Val: 1.0746, Test: 1.0648\n",
            "Epoch: 140, Loss: 2.2622, Train: 1.0578, Val: 1.1550, Test: 1.1504\n",
            "Epoch: 141, Loss: 2.2920, Train: 0.9680, Val: 1.0724, Test: 1.0592\n",
            "Epoch: 142, Loss: 2.2876, Train: 1.0254, Val: 1.1245, Test: 1.1180\n",
            "Epoch: 143, Loss: 2.2317, Train: 0.9951, Val: 1.0952, Test: 1.0881\n",
            "Epoch: 144, Loss: 2.2065, Train: 0.9686, Val: 1.0727, Test: 1.0635\n",
            "Epoch: 145, Loss: 2.2282, Train: 1.0508, Val: 1.1494, Test: 1.1475\n",
            "Epoch: 146, Loss: 2.2604, Train: 0.9587, Val: 1.0651, Test: 1.0552\n",
            "Epoch: 147, Loss: 2.2383, Train: 1.0104, Val: 1.1112, Test: 1.1072\n",
            "Epoch: 148, Loss: 2.1975, Train: 0.9961, Val: 1.1023, Test: 1.0953\n",
            "Epoch: 149, Loss: 2.1735, Train: 0.9682, Val: 1.0761, Test: 1.0675\n",
            "Epoch: 150, Loss: 2.1758, Train: 1.0127, Val: 1.1135, Test: 1.1117\n",
            "Epoch: 151, Loss: 2.2116, Train: 0.9715, Val: 1.0840, Test: 1.0736\n",
            "Epoch: 152, Loss: 2.1948, Train: 1.0094, Val: 1.1202, Test: 1.1143\n",
            "Epoch: 153, Loss: 2.1620, Train: 0.9732, Val: 1.0785, Test: 1.0742\n",
            "Epoch: 154, Loss: 2.1661, Train: 0.9633, Val: 1.0757, Test: 1.0676\n",
            "Epoch: 155, Loss: 2.1570, Train: 1.0443, Val: 1.1531, Test: 1.1514\n",
            "Epoch: 156, Loss: 2.2093, Train: 0.9355, Val: 1.0455, Test: 1.0369\n",
            "Epoch: 157, Loss: 2.2011, Train: 0.9951, Val: 1.1016, Test: 1.0973\n",
            "Epoch: 158, Loss: 2.1416, Train: 1.0048, Val: 1.1201, Test: 1.1108\n",
            "Epoch: 159, Loss: 2.1594, Train: 0.9645, Val: 1.0820, Test: 1.0710\n",
            "Epoch: 160, Loss: 2.1512, Train: 1.0099, Val: 1.1155, Test: 1.1137\n",
            "Epoch: 161, Loss: 2.2107, Train: 0.9594, Val: 1.0784, Test: 1.0699\n",
            "Epoch: 162, Loss: 2.1134, Train: 0.9837, Val: 1.1021, Test: 1.0940\n",
            "Epoch: 163, Loss: 2.1103, Train: 0.9987, Val: 1.1116, Test: 1.1073\n",
            "Epoch: 164, Loss: 2.1065, Train: 0.9387, Val: 1.0552, Test: 1.0465\n",
            "Epoch: 165, Loss: 2.1246, Train: 0.9924, Val: 1.1106, Test: 1.1067\n",
            "Epoch: 166, Loss: 2.0868, Train: 0.9744, Val: 1.0956, Test: 1.0891\n",
            "Epoch: 167, Loss: 2.0791, Train: 0.9544, Val: 1.0737, Test: 1.0675\n",
            "Epoch: 168, Loss: 2.0685, Train: 0.9789, Val: 1.0960, Test: 1.0909\n",
            "Epoch: 169, Loss: 2.0804, Train: 0.9579, Val: 1.0817, Test: 1.0704\n",
            "Epoch: 170, Loss: 2.1081, Train: 1.0087, Val: 1.1309, Test: 1.1254\n",
            "Epoch: 171, Loss: 2.0968, Train: 0.9273, Val: 1.0474, Test: 1.0390\n",
            "Epoch: 172, Loss: 2.1090, Train: 0.9657, Val: 1.0883, Test: 1.0815\n",
            "Epoch: 173, Loss: 2.0414, Train: 1.0091, Val: 1.1324, Test: 1.1273\n",
            "Epoch: 174, Loss: 2.0880, Train: 0.9237, Val: 1.0475, Test: 1.0374\n",
            "Epoch: 175, Loss: 2.1311, Train: 1.0127, Val: 1.1234, Test: 1.1191\n",
            "Epoch: 176, Loss: 2.2079, Train: 0.9855, Val: 1.1140, Test: 1.1061\n",
            "Epoch: 177, Loss: 2.0779, Train: 0.9391, Val: 1.0618, Test: 1.0498\n",
            "Epoch: 178, Loss: 2.2019, Train: 1.0463, Val: 1.1609, Test: 1.1575\n",
            "Epoch: 179, Loss: 2.1883, Train: 0.9513, Val: 1.0731, Test: 1.0666\n",
            "Epoch: 180, Loss: 2.0932, Train: 0.9339, Val: 1.0581, Test: 1.0434\n",
            "Epoch: 181, Loss: 2.2364, Train: 1.0616, Val: 1.1862, Test: 1.1802\n",
            "Epoch: 182, Loss: 2.2452, Train: 0.9641, Val: 1.0859, Test: 1.0803\n",
            "Epoch: 183, Loss: 2.0407, Train: 0.9087, Val: 1.0325, Test: 1.0254\n",
            "Epoch: 184, Loss: 2.2101, Train: 0.9889, Val: 1.1194, Test: 1.1147\n",
            "Epoch: 185, Loss: 2.0358, Train: 1.0262, Val: 1.1567, Test: 1.1499\n",
            "Epoch: 186, Loss: 2.1352, Train: 0.9325, Val: 1.0609, Test: 1.0502\n",
            "Epoch: 187, Loss: 2.1028, Train: 0.9523, Val: 1.0748, Test: 1.0687\n",
            "Epoch: 188, Loss: 2.0928, Train: 0.9830, Val: 1.1106, Test: 1.1057\n",
            "Epoch: 189, Loss: 2.0226, Train: 0.9548, Val: 1.0896, Test: 1.0797\n",
            "Epoch: 190, Loss: 2.0687, Train: 0.9720, Val: 1.1107, Test: 1.1024\n",
            "Epoch: 191, Loss: 2.0296, Train: 0.9773, Val: 1.1104, Test: 1.1042\n",
            "Epoch: 192, Loss: 2.0131, Train: 0.9262, Val: 1.0588, Test: 1.0491\n",
            "Epoch: 193, Loss: 2.0318, Train: 0.9408, Val: 1.0744, Test: 1.0637\n",
            "Epoch: 194, Loss: 1.9926, Train: 0.9902, Val: 1.1263, Test: 1.1185\n",
            "Epoch: 195, Loss: 2.0229, Train: 0.9452, Val: 1.0875, Test: 1.0782\n",
            "Epoch: 196, Loss: 1.9865, Train: 0.9265, Val: 1.0658, Test: 1.0563\n",
            "Epoch: 197, Loss: 1.9846, Train: 0.9619, Val: 1.0938, Test: 1.0860\n",
            "Epoch: 198, Loss: 1.9849, Train: 0.9535, Val: 1.0900, Test: 1.0802\n",
            "Epoch: 199, Loss: 1.9792, Train: 0.9502, Val: 1.0951, Test: 1.0865\n",
            "Epoch: 200, Loss: 1.9710, Train: 0.9443, Val: 1.0875, Test: 1.0801\n",
            "Epoch: 201, Loss: 1.9671, Train: 0.9338, Val: 1.0705, Test: 1.0617\n",
            "Epoch: 202, Loss: 1.9623, Train: 0.9558, Val: 1.0914, Test: 1.0844\n",
            "Epoch: 203, Loss: 1.9543, Train: 0.9435, Val: 1.0876, Test: 1.0809\n",
            "Epoch: 204, Loss: 1.9431, Train: 0.9342, Val: 1.0810, Test: 1.0746\n",
            "Epoch: 205, Loss: 1.9482, Train: 0.9494, Val: 1.0890, Test: 1.0839\n",
            "Epoch: 206, Loss: 1.9394, Train: 0.9396, Val: 1.0763, Test: 1.0693\n",
            "Epoch: 207, Loss: 1.9505, Train: 0.9452, Val: 1.0889, Test: 1.0842\n",
            "Epoch: 208, Loss: 1.9335, Train: 0.9309, Val: 1.0805, Test: 1.0747\n",
            "Epoch: 209, Loss: 1.9314, Train: 0.9392, Val: 1.0847, Test: 1.0790\n",
            "Epoch: 210, Loss: 1.9170, Train: 0.9462, Val: 1.0879, Test: 1.0829\n",
            "Epoch: 211, Loss: 1.9223, Train: 0.9269, Val: 1.0736, Test: 1.0674\n",
            "Epoch: 212, Loss: 1.9236, Train: 0.9526, Val: 1.1000, Test: 1.0974\n",
            "Epoch: 213, Loss: 1.9431, Train: 0.9262, Val: 1.0730, Test: 1.0672\n",
            "Epoch: 214, Loss: 1.9280, Train: 0.9458, Val: 1.0900, Test: 1.0865\n",
            "Epoch: 215, Loss: 1.9119, Train: 0.9338, Val: 1.0831, Test: 1.0784\n",
            "Epoch: 216, Loss: 1.8994, Train: 0.9177, Val: 1.0723, Test: 1.0645\n",
            "Epoch: 217, Loss: 1.9221, Train: 0.9693, Val: 1.1161, Test: 1.1129\n",
            "Epoch: 218, Loss: 1.9547, Train: 0.9229, Val: 1.0712, Test: 1.0625\n",
            "Epoch: 219, Loss: 1.9217, Train: 0.9274, Val: 1.0799, Test: 1.0756\n",
            "Epoch: 220, Loss: 1.8914, Train: 0.9390, Val: 1.0937, Test: 1.0895\n",
            "Epoch: 221, Loss: 1.8914, Train: 0.9233, Val: 1.0755, Test: 1.0676\n",
            "Epoch: 222, Loss: 1.9025, Train: 0.9450, Val: 1.0932, Test: 1.0903\n",
            "Epoch: 223, Loss: 1.9149, Train: 0.9224, Val: 1.0777, Test: 1.0694\n",
            "Epoch: 224, Loss: 1.8965, Train: 0.9354, Val: 1.0927, Test: 1.0885\n",
            "Epoch: 225, Loss: 1.8791, Train: 0.9240, Val: 1.0793, Test: 1.0752\n",
            "Epoch: 226, Loss: 1.8737, Train: 0.9203, Val: 1.0745, Test: 1.0683\n",
            "Epoch: 227, Loss: 1.8852, Train: 0.9493, Val: 1.1050, Test: 1.1013\n",
            "Epoch: 228, Loss: 1.8996, Train: 0.9103, Val: 1.0690, Test: 1.0618\n",
            "Epoch: 229, Loss: 1.8848, Train: 0.9320, Val: 1.0875, Test: 1.0827\n",
            "Epoch: 230, Loss: 1.8684, Train: 0.9299, Val: 1.0882, Test: 1.0823\n",
            "Epoch: 231, Loss: 1.8574, Train: 0.9136, Val: 1.0762, Test: 1.0707\n",
            "Epoch: 232, Loss: 1.8580, Train: 0.9291, Val: 1.0883, Test: 1.0849\n",
            "Epoch: 233, Loss: 1.8626, Train: 0.9228, Val: 1.0794, Test: 1.0707\n",
            "Epoch: 234, Loss: 1.8901, Train: 0.9434, Val: 1.1034, Test: 1.1001\n",
            "Epoch: 235, Loss: 1.8856, Train: 0.9044, Val: 1.0689, Test: 1.0618\n",
            "Epoch: 236, Loss: 1.8630, Train: 0.9316, Val: 1.0918, Test: 1.0858\n",
            "Epoch: 237, Loss: 1.8454, Train: 0.9268, Val: 1.0888, Test: 1.0832\n",
            "Epoch: 238, Loss: 1.8383, Train: 0.9041, Val: 1.0695, Test: 1.0630\n",
            "Epoch: 239, Loss: 1.8508, Train: 0.9425, Val: 1.1016, Test: 1.0982\n",
            "Epoch: 240, Loss: 1.8706, Train: 0.9172, Val: 1.0772, Test: 1.0682\n",
            "Epoch: 241, Loss: 1.8805, Train: 0.9325, Val: 1.0972, Test: 1.0934\n",
            "Epoch: 242, Loss: 1.8614, Train: 0.9086, Val: 1.0764, Test: 1.0694\n",
            "Epoch: 243, Loss: 1.8342, Train: 0.9212, Val: 1.0854, Test: 1.0781\n",
            "Epoch: 244, Loss: 1.8277, Train: 0.9233, Val: 1.0896, Test: 1.0841\n",
            "Epoch: 245, Loss: 1.8337, Train: 0.9076, Val: 1.0766, Test: 1.0679\n",
            "Epoch: 246, Loss: 1.8505, Train: 0.9440, Val: 1.1065, Test: 1.1026\n",
            "Epoch: 247, Loss: 1.8685, Train: 0.9055, Val: 1.0736, Test: 1.0652\n",
            "Epoch: 248, Loss: 1.8380, Train: 0.9183, Val: 1.0891, Test: 1.0837\n",
            "Epoch: 249, Loss: 1.8179, Train: 0.9178, Val: 1.0872, Test: 1.0810\n",
            "Epoch: 250, Loss: 1.8107, Train: 0.9061, Val: 1.0759, Test: 1.0689\n",
            "Epoch: 251, Loss: 1.8139, Train: 0.9248, Val: 1.0959, Test: 1.0911\n",
            "Epoch: 252, Loss: 1.8213, Train: 0.9071, Val: 1.0778, Test: 1.0696\n",
            "Epoch: 253, Loss: 1.8259, Train: 0.9259, Val: 1.0945, Test: 1.0899\n",
            "Epoch: 254, Loss: 1.8392, Train: 0.9122, Val: 1.0848, Test: 1.0758\n",
            "Epoch: 255, Loss: 1.8294, Train: 0.9154, Val: 1.0899, Test: 1.0842\n",
            "Epoch: 256, Loss: 1.8031, Train: 0.9064, Val: 1.0801, Test: 1.0735\n",
            "Epoch: 257, Loss: 1.7956, Train: 0.9134, Val: 1.0886, Test: 1.0797\n",
            "Epoch: 258, Loss: 1.8039, Train: 0.9162, Val: 1.0900, Test: 1.0844\n",
            "Epoch: 259, Loss: 1.8171, Train: 0.9075, Val: 1.0798, Test: 1.0700\n",
            "Epoch: 260, Loss: 1.8252, Train: 0.9341, Val: 1.1074, Test: 1.1027\n",
            "Epoch: 261, Loss: 1.8255, Train: 0.8901, Val: 1.0669, Test: 1.0591\n",
            "Epoch: 262, Loss: 1.8073, Train: 0.9292, Val: 1.1029, Test: 1.0954\n",
            "Epoch: 263, Loss: 1.7965, Train: 0.8993, Val: 1.0777, Test: 1.0720\n",
            "Epoch: 264, Loss: 1.7885, Train: 0.9064, Val: 1.0857, Test: 1.0754\n",
            "Epoch: 265, Loss: 1.8020, Train: 0.9345, Val: 1.1081, Test: 1.1029\n",
            "Epoch: 266, Loss: 1.8218, Train: 0.8869, Val: 1.0658, Test: 1.0554\n",
            "Epoch: 267, Loss: 1.8188, Train: 0.9390, Val: 1.1142, Test: 1.1071\n",
            "Epoch: 268, Loss: 1.8146, Train: 0.8907, Val: 1.0712, Test: 1.0627\n",
            "Epoch: 269, Loss: 1.7824, Train: 0.9086, Val: 1.0902, Test: 1.0811\n",
            "Epoch: 270, Loss: 1.7751, Train: 0.9208, Val: 1.0986, Test: 1.0928\n",
            "Epoch: 271, Loss: 1.7996, Train: 0.8949, Val: 1.0743, Test: 1.0642\n",
            "Epoch: 272, Loss: 1.7992, Train: 0.9256, Val: 1.1026, Test: 1.0957\n",
            "Epoch: 273, Loss: 1.7968, Train: 0.8952, Val: 1.0788, Test: 1.0688\n",
            "Epoch: 274, Loss: 1.7660, Train: 0.9019, Val: 1.0854, Test: 1.0763\n",
            "Epoch: 275, Loss: 1.7591, Train: 0.9144, Val: 1.0964, Test: 1.0900\n",
            "Epoch: 276, Loss: 1.7727, Train: 0.8937, Val: 1.0770, Test: 1.0678\n",
            "Epoch: 277, Loss: 1.7811, Train: 0.9203, Val: 1.0990, Test: 1.0942\n",
            "Epoch: 278, Loss: 1.7887, Train: 0.8975, Val: 1.0830, Test: 1.0746\n",
            "Epoch: 279, Loss: 1.7661, Train: 0.8984, Val: 1.0836, Test: 1.0781\n",
            "Epoch: 280, Loss: 1.7520, Train: 0.9133, Val: 1.0985, Test: 1.0904\n",
            "Epoch: 281, Loss: 1.7523, Train: 0.8815, Val: 1.0679, Test: 1.0604\n",
            "Epoch: 282, Loss: 1.7629, Train: 0.9329, Val: 1.1157, Test: 1.1079\n",
            "Epoch: 283, Loss: 1.7790, Train: 0.8741, Val: 1.0611, Test: 1.0541\n",
            "Epoch: 284, Loss: 1.7939, Train: 0.9471, Val: 1.1289, Test: 1.1217\n",
            "Epoch: 285, Loss: 1.8084, Train: 0.8714, Val: 1.0584, Test: 1.0508\n",
            "Epoch: 286, Loss: 1.8033, Train: 0.9376, Val: 1.1205, Test: 1.1112\n",
            "Epoch: 287, Loss: 1.7816, Train: 0.8810, Val: 1.0714, Test: 1.0651\n",
            "Epoch: 288, Loss: 1.7618, Train: 0.9146, Val: 1.0967, Test: 1.0870\n",
            "Epoch: 289, Loss: 1.7971, Train: 0.9239, Val: 1.1093, Test: 1.1047\n",
            "Epoch: 290, Loss: 1.8000, Train: 0.8772, Val: 1.0663, Test: 1.0590\n",
            "Epoch: 291, Loss: 1.7682, Train: 0.9310, Val: 1.1138, Test: 1.1035\n",
            "Epoch: 292, Loss: 1.7801, Train: 0.8891, Val: 1.0809, Test: 1.0764\n",
            "Epoch: 293, Loss: 1.7791, Train: 0.9129, Val: 1.0954, Test: 1.0881\n",
            "Epoch: 294, Loss: 1.7735, Train: 0.9070, Val: 1.0990, Test: 1.0942\n",
            "Epoch: 295, Loss: 1.7402, Train: 0.8785, Val: 1.0693, Test: 1.0640\n",
            "Epoch: 296, Loss: 1.7483, Train: 0.9317, Val: 1.1117, Test: 1.1029\n",
            "Epoch: 297, Loss: 1.7846, Train: 0.8900, Val: 1.0861, Test: 1.0831\n",
            "Epoch: 298, Loss: 1.7518, Train: 0.8958, Val: 1.0847, Test: 1.0802\n",
            "Epoch: 299, Loss: 1.7317, Train: 0.9088, Val: 1.0995, Test: 1.0930\n"
          ]
        }
      ],
      "source": [
        "for epoch in range(1, 300):\n",
        "    loss = train()\n",
        "    train_rmse = test(train_data)\n",
        "    val_rmse = test(val_data)\n",
        "    test_rmse = test(test_data)\n",
        "    print(f'Epoch: {epoch:03d}, Loss: {loss:.4f}, Train: {train_rmse:.4f}, '\n",
        "          f'Val: {val_rmse:.4f}, Test: {test_rmse:.4f}')"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Lastly, we will predict new links between users and movies and store results back to Neo4j. We will only consider links where the predicted rating is equal to 5.0, which is the highest possible rating, for movie recommendations."
      ],
      "metadata": {
        "id": "3hSJsRyKhHBD"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "MfxjlfZuCSPZ"
      },
      "outputs": [],
      "source": [
        "num_movies = len(movie_mapping)\n",
        "num_users = len(user_mapping)\n",
        "\n",
        "reverse_movie_mapping = dict(zip(movie_mapping.values(),movie_mapping.keys()))\n",
        "reverse_user_mapping = dict(zip(user_mapping.values(),user_mapping.keys()))\n",
        "\n",
        "results = []\n",
        "\n",
        "for user_id in range(0,num_users): \n",
        "\n",
        "    row = torch.tensor([user_id] * num_movies)\n",
        "    col = torch.arange(num_movies)\n",
        "    edge_label_index = torch.stack([row, col], dim=0)\n",
        "\n",
        "    pred = model(data.x_dict, data.edge_index_dict,\n",
        "                 edge_label_index)\n",
        "    pred = pred.clamp(min=0, max=5)\n",
        "\n",
        "    user_neo4j_id = reverse_user_mapping[user_id]\n",
        "\n",
        "    mask = (pred == 5).nonzero(as_tuple=True)\n",
        "\n",
        "    ten_predictions = [reverse_movie_mapping[el] for el in  mask[0].tolist()[:10]]\n",
        "    results.append({'user': user_neo4j_id, 'movies': ten_predictions})\n",
        "    "
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "I've only selected the first ten recommendations for each user to make it simple and not have to import tens of thousands of relationships back to Neo4j. One important thing to note is that we don't filter out existing links or ratings in our predictions, so we'll just skip them during import to the Neo4j database. Let's import those predictions to Neo4j under the RECOMMEND relationships."
      ],
      "metadata": {
        "id": "8k-DBC-whKUD"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import_predictions_query = \"\"\"\n",
        "UNWIND $data AS row\n",
        "MATCH (u:User {userId: row.user})\n",
        "WITH u, row\n",
        "UNWIND row.movies AS movieId\n",
        "MATCH (m:Movie {movieId: movieId})\n",
        "WITH u,m\n",
        "// filter out existing links\n",
        "WHERE NOT (u)-[:RATED]->(m)\n",
        "MERGE (u)-[:RECOMMEND]->(m)\n",
        "\"\"\"\n",
        "\n",
        "fetch_data(import_predictions_query, {'data': results})"
      ],
      "metadata": {
        "id": "DZQUYzukbAMT",
        "outputId": "ee3b2fc8-eae5-4242-c411-1c25cb2ae9ac",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 49
        }
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "\n",
              "  <div id=\"df-15357957-48ea-4af1-82a2-9c1c31fd99e3\">\n",
              "    <div class=\"colab-df-container\">\n",
              "      <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-15357957-48ea-4af1-82a2-9c1c31fd99e3')\"\n",
              "              title=\"Convert this dataframe to an interactive table.\"\n",
              "              style=\"display:none;\">\n",
              "        \n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
              "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
              "  </svg>\n",
              "      </button>\n",
              "      \n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      flex-wrap:wrap;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "      <script>\n",
              "        const buttonEl =\n",
              "          document.querySelector('#df-15357957-48ea-4af1-82a2-9c1c31fd99e3 button.colab-df-convert');\n",
              "        buttonEl.style.display =\n",
              "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "        async function convertToInteractive(key) {\n",
              "          const element = document.querySelector('#df-15357957-48ea-4af1-82a2-9c1c31fd99e3');\n",
              "          const dataTable =\n",
              "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                     [key], {});\n",
              "          if (!dataTable) return;\n",
              "\n",
              "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "            + ' to learn more about interactive tables.';\n",
              "          element.innerHTML = '';\n",
              "          dataTable['output_type'] = 'display_data';\n",
              "          await google.colab.output.renderOutput(dataTable, element);\n",
              "          const docLink = document.createElement('div');\n",
              "          docLink.innerHTML = docLinkHtml;\n",
              "          element.appendChild(docLink);\n",
              "        }\n",
              "      </script>\n",
              "    </div>\n",
              "  </div>\n",
              "  "
            ],
            "text/plain": [
              "Empty DataFrame\n",
              "Columns: []\n",
              "Index: []"
            ]
          },
          "metadata": {},
          "execution_count": 69
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Conclusion\n",
        "PyTorch Geometric is a powerful library that allows you to develop and train custom Graph Neural Networks applications. I am looking forward to exploring it more and seeing all the applications I can create using it.\n",
        "The MovieLens dataset contains several node features we haven't used, like the release date or the movie budget that you could test out. You could also try and change the GNN definition. Let me know if you find any exciting approaches that work for you."
      ],
      "metadata": {
        "id": "9Wblq8KShNDV"
      }
    },
    {
      "cell_type": "code",
      "source": [
        ""
      ],
      "metadata": {
        "id": "fZX5JSFFbZes"
      },
      "execution_count": null,
      "outputs": []
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "name": "Movie-recommendations.ipynb",
      "provenance": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.8.8"
    },
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "2ed7832a3aa645da863d301e7b46200d": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_b328acaed7674f31a2b2e63c33689a1e",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_49c61d34cac0437ea23db3c5b02bda92",
              "IPY_MODEL_4190e2c5194e4c1d940701a2c543df14",
              "IPY_MODEL_9dabb8d8822f4d85a82a0fbb2e86f384"
            ]
          }
        },
        "b328acaed7674f31a2b2e63c33689a1e": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "49c61d34cac0437ea23db3c5b02bda92": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_c4bea143b2ed42a4acfbc11c9d18faa5",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_b0be35e10de74941841a1de658dd6b7c"
          }
        },
        "4190e2c5194e4c1d940701a2c543df14": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_9a0cfbecdba84a8882dc439ef93cd727",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 1175,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 1175,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_f46b23bb69324124a023d6c03887a056"
          }
        },
        "9dabb8d8822f4d85a82a0fbb2e86f384": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_76161e4c40514ea6aa60375e01ef5200",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 1.18k/1.18k [00:00&lt;00:00, 17.9kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_9ffe3dbbed084d0d88c7cb9a9f237787"
          }
        },
        "c4bea143b2ed42a4acfbc11c9d18faa5": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "b0be35e10de74941841a1de658dd6b7c": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "9a0cfbecdba84a8882dc439ef93cd727": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "f46b23bb69324124a023d6c03887a056": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "76161e4c40514ea6aa60375e01ef5200": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "9ffe3dbbed084d0d88c7cb9a9f237787": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "7343ea337d084b4b8d7660e3938a14bd": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_3009e58aeb5a44538ebd0314c6daa270",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_3ca707d5a50844f9ad49d0a86c27f536",
              "IPY_MODEL_12af7f8432e04797bbe59cf663cf9c8a",
              "IPY_MODEL_1261ca6912af40889e75048542d34276"
            ]
          }
        },
        "3009e58aeb5a44538ebd0314c6daa270": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "3ca707d5a50844f9ad49d0a86c27f536": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_17065eadc68f43c4a39d077c0d056485",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_d0ad530de9e64eafb0799c93c1197463"
          }
        },
        "12af7f8432e04797bbe59cf663cf9c8a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_f32a86aee66c4b1d994c52819fbf5cd9",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 10177,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 10177,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_2c494faeb567413aa0a791ed5c49e101"
          }
        },
        "1261ca6912af40889e75048542d34276": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_21ba40cb78d843f3afd11e18ab409297",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 10.2k/10.2k [00:00&lt;00:00, 162kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_64b01488aeea447b841f48af79b7b552"
          }
        },
        "17065eadc68f43c4a39d077c0d056485": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "d0ad530de9e64eafb0799c93c1197463": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "f32a86aee66c4b1d994c52819fbf5cd9": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "2c494faeb567413aa0a791ed5c49e101": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "21ba40cb78d843f3afd11e18ab409297": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "64b01488aeea447b841f48af79b7b552": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "dfbd87574a194f37b5f9e9b23f8f3927": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_8e3962421296400fab6252aad3f4ccd6",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_143a092b5e5445d9b6527c9cd1d5caad",
              "IPY_MODEL_e0f26c1d4eb64eeb93ab55b4c2130c75",
              "IPY_MODEL_d01d031f25e74fb6a8a8b86efadb17e3"
            ]
          }
        },
        "8e3962421296400fab6252aad3f4ccd6": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "143a092b5e5445d9b6527c9cd1d5caad": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_3e11f7cd93b7483597cd2e3aae549aa2",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_26a8c64f7c864e33accc3332fdc4713f"
          }
        },
        "e0f26c1d4eb64eeb93ab55b4c2130c75": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_0e628a4f28824ee7a3c8c6b78e5cf627",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 612,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 612,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_d95e49a82e1945288e6954a50487168a"
          }
        },
        "d01d031f25e74fb6a8a8b86efadb17e3": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_debc5f3e48e944a190af7273baaccb7c",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 612/612 [00:00&lt;00:00, 15.4kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_584017342dbb4df297ce3ab7fbcd465f"
          }
        },
        "3e11f7cd93b7483597cd2e3aae549aa2": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "26a8c64f7c864e33accc3332fdc4713f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "0e628a4f28824ee7a3c8c6b78e5cf627": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "d95e49a82e1945288e6954a50487168a": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "debc5f3e48e944a190af7273baaccb7c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "584017342dbb4df297ce3ab7fbcd465f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "54aafa4efb6f40ccabe1ddb9e213fb6b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_680659a48868456897457f2886520825",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_45ae42d3912441288b2f1ab50eb6b9eb",
              "IPY_MODEL_7ce04de377df4153ad6a6105bc1044a4",
              "IPY_MODEL_f27a779f650c463dbd57eea31d5934fa"
            ]
          }
        },
        "680659a48868456897457f2886520825": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "45ae42d3912441288b2f1ab50eb6b9eb": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_93b512cb9a134089b35a0515d1a590bf",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_8b6424e75ad14d41a9e56206a48312b6"
          }
        },
        "7ce04de377df4153ad6a6105bc1044a4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_02062490132c4340825e2810863b0aa3",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 116,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 116,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_83c44afc625642469f264dbd28107f29"
          }
        },
        "f27a779f650c463dbd57eea31d5934fa": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_808d58c5ed084ed683e7f9f8af82fa3c",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 116/116 [00:00&lt;00:00, 2.41kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_5df8e4cb82444212a6aef84cff89fd66"
          }
        },
        "93b512cb9a134089b35a0515d1a590bf": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "8b6424e75ad14d41a9e56206a48312b6": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "02062490132c4340825e2810863b0aa3": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "83c44afc625642469f264dbd28107f29": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "808d58c5ed084ed683e7f9f8af82fa3c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "5df8e4cb82444212a6aef84cff89fd66": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "99cba8de59134c599c5474d1963a9aad": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_fe777b0f308a492aad01e24209377412",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_72a9d8396431419db860ec8ec9059fc5",
              "IPY_MODEL_8d2564e7c2b84554aa9bca881b9b2828",
              "IPY_MODEL_6d912a85a6f244faa7bd931c59994a20"
            ]
          }
        },
        "fe777b0f308a492aad01e24209377412": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "72a9d8396431419db860ec8ec9059fc5": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_42806007d52645e8b5434338aa428df9",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_44c07baf2bf74f3b8c7e339ec2a76f8c"
          }
        },
        "8d2564e7c2b84554aa9bca881b9b2828": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_8b40f1b97772403283ff38861d801acb",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 39265,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 39265,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_5588345ca8f44088ac4a50db2df580dc"
          }
        },
        "6d912a85a6f244faa7bd931c59994a20": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_92d1240ede3341eaa5634225c1bf9006",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 39.3k/39.3k [00:00&lt;00:00, 986kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_719929847ba1413496e1eba5556c17e8"
          }
        },
        "42806007d52645e8b5434338aa428df9": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "44c07baf2bf74f3b8c7e339ec2a76f8c": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "8b40f1b97772403283ff38861d801acb": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "5588345ca8f44088ac4a50db2df580dc": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "92d1240ede3341eaa5634225c1bf9006": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "719929847ba1413496e1eba5556c17e8": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "ce01920df03b4cdd9728f723ffbc5734": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_5f6de51db8134bd29af33d25d494cfe2",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_bcbffddc7f35428e9451aa45ab202538",
              "IPY_MODEL_74ad696a528447caa9fd880877b03caa",
              "IPY_MODEL_4ac9cea778ea4e2db682ac5e94ac655e"
            ]
          }
        },
        "5f6de51db8134bd29af33d25d494cfe2": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "bcbffddc7f35428e9451aa45ab202538": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_5b03671271d043e98397118c3bb0be58",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_8891bc65a12f4cca964d182c66849f8d"
          }
        },
        "74ad696a528447caa9fd880877b03caa": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_e0765df4f3634bffa11b10ad23ef996a",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 349,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 349,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_88f6ad2e4006448fb3eca9a79e12f1ee"
          }
        },
        "4ac9cea778ea4e2db682ac5e94ac655e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_f90af6b2f2024e599faafbe2a1922e27",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 349/349 [00:00&lt;00:00, 7.61kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_d728ba0185644fa88594dc4dae4efea5"
          }
        },
        "5b03671271d043e98397118c3bb0be58": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "8891bc65a12f4cca964d182c66849f8d": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "e0765df4f3634bffa11b10ad23ef996a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "88f6ad2e4006448fb3eca9a79e12f1ee": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "f90af6b2f2024e599faafbe2a1922e27": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "d728ba0185644fa88594dc4dae4efea5": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "8d41059822434abc945f543b7aae387f": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_14267d1b68e344aaaf5118bd3b154765",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_5ea31c011b9a40fda353e14f57e86f2b",
              "IPY_MODEL_f88361401a00477cacf61aaa49473fe4",
              "IPY_MODEL_7390d68bc8a14810879bd6b41c4b1137"
            ]
          }
        },
        "14267d1b68e344aaaf5118bd3b154765": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "5ea31c011b9a40fda353e14f57e86f2b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_ff65f3cdf71044fda5f0dfc0a0221d89",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_6f847c67f78945d69e2d3f97ec718e3b"
          }
        },
        "f88361401a00477cacf61aaa49473fe4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_5481dc16e39d4a61be7d74302e9e9e17",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 90888945,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 90888945,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_81ee9503cb634c5ead7cca948821eb84"
          }
        },
        "7390d68bc8a14810879bd6b41c4b1137": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_29de7cec1aca4ab0a5f6716936699bb4",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 90.9M/90.9M [00:02&lt;00:00, 34.6MB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_cc750ec1c06e4942834ddf9b1c84921b"
          }
        },
        "ff65f3cdf71044fda5f0dfc0a0221d89": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "6f847c67f78945d69e2d3f97ec718e3b": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "5481dc16e39d4a61be7d74302e9e9e17": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "81ee9503cb634c5ead7cca948821eb84": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "29de7cec1aca4ab0a5f6716936699bb4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "cc750ec1c06e4942834ddf9b1c84921b": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "27dfebe112db405aae24af245f21d7d9": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_a810985fe380471eb0e46d13a2ddb6c1",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_955e77fd457342c9a02883aba817e07c",
              "IPY_MODEL_7c81c9420fba4035906273ef1a1c3abf",
              "IPY_MODEL_66c0871323e846538679d431ac115866"
            ]
          }
        },
        "a810985fe380471eb0e46d13a2ddb6c1": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "955e77fd457342c9a02883aba817e07c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_4b19e2a4cc1245fdbf065d08d67127ec",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_3ecd52a8cb894df483b54d1293b24580"
          }
        },
        "7c81c9420fba4035906273ef1a1c3abf": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_c3eb72af8817454fb25993d6168a84c2",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 53,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 53,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_2137e0d7eeb246b8a1f33074ce97aa26"
          }
        },
        "66c0871323e846538679d431ac115866": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_6cd4327d84a44cf8abb44af93854c413",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 53.0/53.0 [00:00&lt;00:00, 1.36kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_1f59507b0914472f8eb9497580e6d1bf"
          }
        },
        "4b19e2a4cc1245fdbf065d08d67127ec": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "3ecd52a8cb894df483b54d1293b24580": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "c3eb72af8817454fb25993d6168a84c2": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "2137e0d7eeb246b8a1f33074ce97aa26": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "6cd4327d84a44cf8abb44af93854c413": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "1f59507b0914472f8eb9497580e6d1bf": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "821ef8a0ca3e4e1993448f158a7db0cc": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_b2e11df92e5342118b2b1c71048fe0ed",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_7e40c49b4f12434e9d87e9e14bee0feb",
              "IPY_MODEL_2b6c7346d9ce4d91be1202df59acf5b4",
              "IPY_MODEL_2748df33b52d4170b0b560489a55f8fd"
            ]
          }
        },
        "b2e11df92e5342118b2b1c71048fe0ed": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "7e40c49b4f12434e9d87e9e14bee0feb": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_96121a5bc2954046bdc3c2991d5acb83",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_eec4b0817dfc4dbaab4f9cc251d4abed"
          }
        },
        "2b6c7346d9ce4d91be1202df59acf5b4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_ee812707b7844ef4913ab7b9ced0c1d3",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 112,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 112,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_f7b59d4d0a11436586e304f771f04747"
          }
        },
        "2748df33b52d4170b0b560489a55f8fd": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_e3b1bc91a3f842e1aff9c9a35477f1b4",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 112/112 [00:00&lt;00:00, 2.70kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_be1065f32019490daf4308f40fdb985f"
          }
        },
        "96121a5bc2954046bdc3c2991d5acb83": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "eec4b0817dfc4dbaab4f9cc251d4abed": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "ee812707b7844ef4913ab7b9ced0c1d3": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "f7b59d4d0a11436586e304f771f04747": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "e3b1bc91a3f842e1aff9c9a35477f1b4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "be1065f32019490daf4308f40fdb985f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "ce2a2f44070042a8bda93f270ea14685": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_2362d756479841a1b1ef3c3db62ec373",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_52300692bd0d4477943e8ee14e9ebc0a",
              "IPY_MODEL_dfe0487e11df41ba824b455dd20a163e",
              "IPY_MODEL_807a1afb5e964c05b55f53b774317cbe"
            ]
          }
        },
        "2362d756479841a1b1ef3c3db62ec373": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "52300692bd0d4477943e8ee14e9ebc0a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_9e1f8cecab994168a7144fc5fda92cec",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_018a6a8c852f4a00bb97e8d315d51d4d"
          }
        },
        "dfe0487e11df41ba824b455dd20a163e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_482df50efb424fc1bd59abf3af1821c0",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 466247,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 466247,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_8f3c3d5cce1a4d109088c876e8b62c2c"
          }
        },
        "807a1afb5e964c05b55f53b774317cbe": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_8b86ebf95d5d4d1ebd270d7b796b64db",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 466k/466k [00:00&lt;00:00, 942kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_88641bcef133475da85ca5edb2d474e6"
          }
        },
        "9e1f8cecab994168a7144fc5fda92cec": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "018a6a8c852f4a00bb97e8d315d51d4d": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "482df50efb424fc1bd59abf3af1821c0": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "8f3c3d5cce1a4d109088c876e8b62c2c": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "8b86ebf95d5d4d1ebd270d7b796b64db": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "88641bcef133475da85ca5edb2d474e6": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "84b016393ee14e10beb19fbe29d672e0": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_99195e3d6b6f4dbaa4470e881ae3cb28",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_c0dae58679744a6fbf6a23756d92074d",
              "IPY_MODEL_ccff1b17e7494d65975462f521298c35",
              "IPY_MODEL_e71b9c290b3a48b4a5db2b8439ea87b4"
            ]
          }
        },
        "99195e3d6b6f4dbaa4470e881ae3cb28": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "c0dae58679744a6fbf6a23756d92074d": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_c9ae3ab14562473db2688cc1b1396647",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_20aeadb8971f45448b36c6e7066639a4"
          }
        },
        "ccff1b17e7494d65975462f521298c35": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_1db1a67451fd452a99e8e81d8be40b6d",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 350,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 350,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_2d08c18e0efa4b69b18f7177355d6585"
          }
        },
        "e71b9c290b3a48b4a5db2b8439ea87b4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_79bbad52e1994306a9a7f1fc1322321c",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 350/350 [00:00&lt;00:00, 6.45kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_171dd30a9b6849ba9947a974cdc3c25e"
          }
        },
        "c9ae3ab14562473db2688cc1b1396647": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "20aeadb8971f45448b36c6e7066639a4": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "1db1a67451fd452a99e8e81d8be40b6d": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "2d08c18e0efa4b69b18f7177355d6585": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "79bbad52e1994306a9a7f1fc1322321c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "171dd30a9b6849ba9947a974cdc3c25e": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "0e9debf346324eae9cad0485ef372b1b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_1c39c7562d57447cb03bdc454d98ee0d",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_39593e2deb634b2e87bbf56033066baf",
              "IPY_MODEL_70de1787cd5345959ae486369657ccaf",
              "IPY_MODEL_d0b96d48773c49e1a7248c4a1ebd7b2a"
            ]
          }
        },
        "1c39c7562d57447cb03bdc454d98ee0d": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "39593e2deb634b2e87bbf56033066baf": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_92106cec5aba40a28576b988156c93a1",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_a4b557bbae6c44939decb80751d395aa"
          }
        },
        "70de1787cd5345959ae486369657ccaf": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_2ac88ec0505c4fbbabd07d324b7f0f1d",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 13156,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 13156,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_4917d9fd31b04a4dacefc7c9d05b28fd"
          }
        },
        "d0b96d48773c49e1a7248c4a1ebd7b2a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_d97fb575f4764d7caaf65f04c8517dd0",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 13.2k/13.2k [00:00&lt;00:00, 267kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_035aeb3050e14f299e8a5e0272b4a111"
          }
        },
        "92106cec5aba40a28576b988156c93a1": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "a4b557bbae6c44939decb80751d395aa": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "2ac88ec0505c4fbbabd07d324b7f0f1d": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "4917d9fd31b04a4dacefc7c9d05b28fd": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "d97fb575f4764d7caaf65f04c8517dd0": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "035aeb3050e14f299e8a5e0272b4a111": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "da6f659f6d744b25bf4b56a9269cc486": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_c8db05fab59c4d8d911992054ff848d3",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_b3870b7d62ad485482721bf7f2ef53b4",
              "IPY_MODEL_97301f4dfde04a61baad54812e67398c",
              "IPY_MODEL_eb54de7fad6743369fd3f92b04135603"
            ]
          }
        },
        "c8db05fab59c4d8d911992054ff848d3": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "b3870b7d62ad485482721bf7f2ef53b4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_e5b2ae09244f49598a172c7911374be5",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_65a327a83e844bb2b5b476c40a791819"
          }
        },
        "97301f4dfde04a61baad54812e67398c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_eabbaef67f0c4f8792b66a3417001860",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 231508,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 231508,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_2101faad91694927b081ef9fa2ef463b"
          }
        },
        "eb54de7fad6743369fd3f92b04135603": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_f551d22d6e824ebba76bfdc42b0ba0c4",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 232k/232k [00:00&lt;00:00, 1.83MB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_6a12024c06404c7fb91108c143dc9e64"
          }
        },
        "e5b2ae09244f49598a172c7911374be5": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "65a327a83e844bb2b5b476c40a791819": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "eabbaef67f0c4f8792b66a3417001860": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "2101faad91694927b081ef9fa2ef463b": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "f551d22d6e824ebba76bfdc42b0ba0c4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "6a12024c06404c7fb91108c143dc9e64": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "61fc9abeca84445b9177b2577bc97497": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_8ee15cb5d3914244bb2b87b32e7e7867",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_ecf93ceaa6d74a2cb54bb539305cc63a",
              "IPY_MODEL_6447255d6e324b5e866b19093885f7e8",
              "IPY_MODEL_e37a6efdf41d41a08580356f3dd73878"
            ]
          }
        },
        "8ee15cb5d3914244bb2b87b32e7e7867": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "ecf93ceaa6d74a2cb54bb539305cc63a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_3ee8975e95c9433585354289010773e4",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Downloading: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_2dc479a29b1d424c9bbd3508220339e2"
          }
        },
        "6447255d6e324b5e866b19093885f7e8": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_c378f823b322454ba92dad95ea3db7a9",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 190,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 190,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_906ec2c14d7f4ef2a072c5ba5c153659"
          }
        },
        "e37a6efdf41d41a08580356f3dd73878": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_b4413a497196483c8bcf8dd80b60760b",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 190/190 [00:00&lt;00:00, 3.88kB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_8cbdcc45e9884fdd86c1e068f5e20c31"
          }
        },
        "3ee8975e95c9433585354289010773e4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "2dc479a29b1d424c9bbd3508220339e2": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "c378f823b322454ba92dad95ea3db7a9": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "906ec2c14d7f4ef2a072c5ba5c153659": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "b4413a497196483c8bcf8dd80b60760b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "8cbdcc45e9884fdd86c1e068f5e20c31": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "2ac16e40276d4ae9b523bf43d6a722e6": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_4a562a71af824db7b49b4b8139a22985",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_6d353e3a6e6b4c7bac6c4863ac9997dd",
              "IPY_MODEL_a4ec1486d64c4151bf116b195f81b931",
              "IPY_MODEL_59f38ca6aaa640dab47ae5a582209b6b"
            ]
          }
        },
        "4a562a71af824db7b49b4b8139a22985": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "6d353e3a6e6b4c7bac6c4863ac9997dd": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_5c812352f3704787bbb985760a65ed60",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "Batches: 100%",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_11c4975942fe4977928bc86d7555d2a6"
          }
        },
        "a4ec1486d64c4151bf116b195f81b931": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_0129c883f97f42e7933be2887a92b7dd",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 286,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 286,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_85908791490a4cb681f07c35499b5cb4"
          }
        },
        "59f38ca6aaa640dab47ae5a582209b6b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_85086e756f92412cb6eb5da1261568bd",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 286/286 [00:03&lt;00:00, 88.71it/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_b9f7834f1e2d4371a67aebea10a2d1ca"
          }
        },
        "5c812352f3704787bbb985760a65ed60": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "11c4975942fe4977928bc86d7555d2a6": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "0129c883f97f42e7933be2887a92b7dd": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "85908791490a4cb681f07c35499b5cb4": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "85086e756f92412cb6eb5da1261568bd": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "b9f7834f1e2d4371a67aebea10a2d1ca": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        }
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
